функция нахождения наименьшего делителя числа итеративный процесс
const smallestDivisor = (num) => {
const denominator = 2;
const result = (num, denominator) => {
return (num % denominator);
}
if (result === 0) {
return denominator;
}
*!*result(num, denominator+1);*/!*
};
smallestDivisor(100);
Суть программа для нахождения наименьшего делителя числа, работает просто прибавляет к делителю 1 и смотрит если делит без остатка то все ок и возвращает делитель Но не работает в 9 строчке возвращает undefined |
const smallestDivisor = num => {
let d = 2;
while(num % d++) {}
return d;
};
smallestDivisor(100);
Оно? |
Цитата:
Мне не нужно решение мне нужно понять почему происходит ошибка |
Цитата:
По этому функция вызывается один раз. (ваш К.О.) Условие где стоит return не выполнятся по этому результат выражения == undefined (ваш К.О.) :D |
Цитата:
допустим if не выполняется но есть же всегда другая ветка result(num, denominator+1); |
Alexsandr, return перед вызовом не стоит.
|
|
1 const smallestDivisor = (num) => {
2 // BEGIN (write your solution here)
3 const denominator = 2;
4 const result = (num, denominator) => {
5 return(num%denominator);
6 }
7 result(num, denominator);
8 if (result === 0) {
9 return denominator;
10 } else if (denominator === 10)
11 {
12 return 1;
13 } else {
14 return result(num, denominator+1);
15 } // END
16 };
17
18 smallestDivisor(10);
В седьмой строке вычисляется значение функции-константы result В восьмой строке сравнивается значение result c 0 Проблема в том что ничего не происходит, программа идет дальше вниз хотя условие должно выполняться Почему так ведь result это функция и когда она вычисляется то уже константа, или в условии выполняется функция? if (result === 0) |
Alexsandr, так Вы пытаетесь саму функцию сравнить с нулём, а не результат её выполнения.
const smallestDivisor = (num) => {
const denominator = 2;
const result = (num, denominator) => {
return (num % denominator);
}
if (result(num, denominator) === 0) {
return denominator;
}
return result(num, denominator+1);
};
smallestDivisor(100);
|
Цитата:
|
Цитата:
if (result(num, denominator) === 0) { } |
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 что бы оценить результат и прекратить рекурсию, но что то идет не так |
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 Почему так? |
Цитата:
|
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) ]); |
Это понятно, но почему при 11 функция iter дает результат как undefined ?
|
let getSmallestDivisor = (n, i = 2) => n % i === 0 ? i : i > Math.sqrt(n) ? 1 : getSmallestDivisor(n, i + 1 что за операторы "?" |
Alexsandr,
в 8 строчке поставить return iter(counter+1, num); |
Скажите пожалуйста почему в шестой строчке 06 return num;
Сразу не прерывает выполнение функции и не отдает результат? Почему потом идет зацикливание на восьмой строчке 08 iter(counter+1, num); Ведь команда return сразу должна прерывать выполнение и выдавать результат? |
| Часовой пояс GMT +3, время: 20:09. |