Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 23.05.2017, 12:52
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

Сообщение от Alexsandr
А как сделать чтоб сравнить результат?
Вызвать её с помощью круглых скобок и передать параметры.

if (result(num, denominator) === 0) {

}
Ответить с цитированием
  #12 (permalink)  
Старый 29.05.2017, 14:07
Интересующийся
Отправить личное сообщение для Alexsandr Посмотреть профиль Найти все сообщения от Alexsandr
 
Регистрация: 22.05.2017
Сообщений: 25

const smallestDivisor = (num) => {
  // BEGIN (write your solution here)
const denominator = 2;  
const resultFinish = (num, denominator) => {
const result = (num, denominator) => {
   return(num%denominator);
}

if (result(num, denominator) === 0) {
return denominator;
} else if (denominator === 10)
{
return 1;
} else {
return resultFinish(num, denominator+1);
}}  // END
};


Первая ошибка была в том что пытался сравнивать функцию с нулем > if (result === 0) результатом было что он интерпретатор пропускал это условие, сам же думал что const result = (num, denominator) => { return(num%denominator); достаточно просто указать как переменную в условии, но на деле вышло что недостаточно указать функцию нужно дать ей аргументы чтоб она вычислила значение,
чтобы рекурсия замкнулась я создал функцию resultFinish которая включает result и условия if что бы оценить результат и прекратить рекурсию, но что то идет не так
Ответить с цитированием
  #13 (permalink)  
Старый 02.06.2017, 14:46
Интересующийся
Отправить личное сообщение для Alexsandr Посмотреть профиль Найти все сообщения от Alexsandr
 
Регистрация: 22.05.2017
Сообщений: 25

const smallestDivisor = (num) => {
      const iter = (counter, num) => { // counter это делитель, начинает с числа 2 и дальше +1 
    if ((num % counter) === 0) {// проверяет если делиться без остатка то возвращает делитель
      return counter;
      } else if (counter === 10) {// если так и не поделилось а мы перебрали все делители до 10 то дальше делить не имеет смысла и это число делиться только на себя возвращаем само число
        return num;
      } else {// в остальных случаях делаем все по новой но прибавляем к делителю +1
     iter(counter+1, num);
      }
  }
  return iter(2, num);
};

https://goo.gl/05Bxj7 ссылка на работу функции

Не знаю почему так сначала функция iter(2, 11);
вычисляет добавляя +1
iter( 3, 11);
iter( 4, 11);
iter( 5, 11);
iter( 6, 11);
iter( 7, 11);
iter( 8, 11);
ter( 9, 11);
iter( 10, 11);
return num; потому как мы перебрали все делители до 10 и дальше не имеет смысла, значит наименьший делитель само число
Но тут происходит странное
Return value 11
Return value undefined и все складывается обратно со значением Return value undefined Почему так?
Ответить с цитированием
  #14 (permalink)  
Старый 02.06.2017, 15:09
Кандидат Javascript-наук
Отправить личное сообщение для Diphenyl Oxalate Посмотреть профиль Найти все сообщения от Diphenyl Oxalate
 
Регистрация: 21.01.2017
Сообщений: 139

Цитата:
если так и не поделилось а мы перебрали все делители до 10 то дальше делить не имеет смысла и это число делиться только на себя возвращаем само число
С чего это? Например, число 169 делится только на 13, так что надо перебирать не до 10, а до Math.sqrt(n)
Ответить с цитированием
  #15 (permalink)  
Старый 02.06.2017, 15:17
Кандидат Javascript-наук
Отправить личное сообщение для Diphenyl Oxalate Посмотреть профиль Найти все сообщения от Diphenyl Oxalate
 
Регистрация: 21.01.2017
Сообщений: 139

let getSmallestDivisor = (n, i = 2) => n % i === 0 ? i : i > Math.sqrt(n) ? 1 : getSmallestDivisor(n, i + 1);

alert([
  getSmallestDivisor(167),
  getSmallestDivisor(168),
  getSmallestDivisor(169)
]);
Ответить с цитированием
  #16 (permalink)  
Старый 02.06.2017, 15:44
Интересующийся
Отправить личное сообщение для Alexsandr Посмотреть профиль Найти все сообщения от Alexsandr
 
Регистрация: 22.05.2017
Сообщений: 25

Это понятно, но почему при 11 функция iter дает результат как undefined ?
Ответить с цитированием
  #17 (permalink)  
Старый 02.06.2017, 17:06
Интересующийся
Отправить личное сообщение для Alexsandr Посмотреть профиль Найти все сообщения от Alexsandr
 
Регистрация: 22.05.2017
Сообщений: 25

let getSmallestDivisor = (n, i = 2) => n % i === 0 ? i : i > Math.sqrt(n) ? 1 : getSmallestDivisor(n, i + 1

что за операторы "?"
Ответить с цитированием
  #18 (permalink)  
Старый 02.06.2017, 19:16
Кандидат Javascript-наук
Отправить личное сообщение для Diphenyl Oxalate Посмотреть профиль Найти все сообщения от Diphenyl Oxalate
 
Регистрация: 21.01.2017
Сообщений: 139

Alexsandr,
в 8 строчке поставить return iter(counter+1, num);
Ответить с цитированием
  #19 (permalink)  
Старый 03.06.2017, 03:12
Интересующийся
Отправить личное сообщение для Alexsandr Посмотреть профиль Найти все сообщения от Alexsandr
 
Регистрация: 22.05.2017
Сообщений: 25

Скажите пожалуйста почему в шестой строчке 06 return num;
Сразу не прерывает выполнение функции и не отдает результат? Почему потом идет зацикливание на восьмой строчке 08 iter(counter+1, num);
Ведь команда return сразу должна прерывать выполнение и выдавать результат?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Есть ли функция, делающая однозн. числа двузначными?) Т.е. "1" => "01" FirstFrost Общие вопросы Javascript 14 08.02.2012 17:38