Прохожу уроки на Hexlet и столкнулся с темой «итеративный процесс«.
Думаю, что в моем коде (см. ниже) не хватает ещё нескольких условий (инструкций) для его грамотного выполнения.
Не прошу выполнить всё за меня, но прошу дать наводку или объяснить, чего не хватает. ГОТОВЫЙ КОД МНЕ НЕ НУЖЕН!
const nod = (num) => {
const iter = (delitel, acc) => {
if (delitel === 1) {
return acc
}
return iter(delitel - 1, acc % delitel)
}
return iter(5, num)
}
console.log(nod(15));
задан 28 янв 2019 в 10:42
15
const nd = (num, div = 1) => num % ++div ? nd(num, div) : div;
console.log(nd(15));
ответ дан 28 янв 2019 в 12:45
С помощью рекурсии это можно сделать так
const node = (num) => {
const iter = (divider = 2) => {
if (divider * divider > num) {
return num;
}
if (num % divider) {
return iter(divider + 1);
}
return divider;
}
return iter();
}
console.log(node(15));
ответ дан 28 янв 2019 в 12:03
VladimirVladimir
1,6977 серебряных знаков6 бронзовых знаков
1
Как я помню из SICP итеративный процесс это рекурсия в которой рекурсивный вызов — последнее действие в функции. Это ещё называется хвостовая рекурсия.
Тогда задачу можно решить например так:
const least_divisor = n => {
const iter = d => {
if (n % d === 0) {
return d;
}
return iter(d + 1);
}
return iter(2);
};
Хвостовая рекурсия в функции с говорящим названием iter
.
Или можно перебирать делители с другого конца. Выглядит странно, но работает:
const least_divisor = n => {
const iter = (d, least_d) => {
if (d === 1) {
return least_d;
}
if (n % d === 0) {
least_d = d;
}
return iter(d - 1, least_d);
}
return iter(n - 1, n);
};
ответ дан 27 мая 2021 в 22:49
const smallestDivisor = (num) => {
if (num % 2 === 0 && num > 0) {
return 2;
} else if (num <= 0) {
return NaN;
} else if (num === 1) {
return num;
}
// Проверки на корректный ввод данных для значения "num"
const devider = (count = 2) => {
/* Если "Num" делится на значение "devider" с остатком
(остаток от деления не равен 0, к значению делителя
прибовляем (+1) */
if (num % count !== 0) {
return devider(count + 1);
} else {
/* Дефолтное значение (если остаток от деления равен 0,
count остается прежним) */
return count;
}
}
return devider();
}
0xdb
51.4k194 золотых знака56 серебряных знаков232 бронзовых знака
ответ дан 25 янв 2022 в 15:02
Евгений КолмакЕвгений Колмак
4732 золотых знака3 серебряных знака13 бронзовых знаков
1
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// BEGIN (write your solution here) | |
const smallestDivisor = num => { | |
let divisor = 2; | |
if(num < 1) { | |
return NaN; | |
} | |
if(num === 1) { | |
return num; | |
} | |
while (num % divisor) { | |
divisor++; | |
} | |
return divisor; | |
}; | |
// END | |
export default smallestDivisor; | |
solution.js | |
Напишите функцию smallestDivisor. Она должна находить наименьший целый делитель числа. Поведение у функции должно быть таким же, как в предыдущем уроке, но реализация — код функции — должно быть другим. На этот раз реализуйте императивный итеративный процесс, что означает: | |
не используйте рекурсию | |
используйте переменные | |
используйте цикл while | |
Например, наименьший делитель числа 15 это 3. | |
smallestDivisor(15); // 3 | |
smallestDivisor(17); // 17 | |
smallestDivisor(0); // NaN | |
smallestDivisor(-3); // NaN | |
Замечание: Если переданное в smallestDivisor число меньше единицы, возвращайте NaN. | |
Идея алгоритма: | |
Попробуйте разделить число на 2. | |
Если число делится без остатка, то это наименьший делитель. | |
Если нет, то попробуйте следующий делитель. | |
Если ничего не делит число без остатка, то переданное число является простым, так что его наименьший делитель — оно само (не считая 1) | |
Подсказка | |
Вспомните про оператор % (modulus or остаток от деления) из урока 4. Он вычисляет остаток от деления одного операнда на другой. Например, 11%5 это 1, а 10%2 это 0. | |
Так что если x%y это 0, то y делит x без остатка. |
Как находить наименьший делитель в итеративном процессе рекурсии?
Прохожу курс основ программирования на Хекслете.
В задачке по итеративному процессу, где надо найти наименьший делитель заданного числа случился хардстак. Вот мой код:
const smallestDivisor = (num) => {
const iter = (counter, acc) => {
if (counter === 1) {
return 1;
}
if (counter % acc) {
return acc;
}
return iter(counter, acc + 1);
};
return iter(num, 4);
};
Пытаюсь найти наименьший делитель для числа 4, который является 2кой.
Спойлерить решение от Хекслета не хочу, хочу понять как решать.
-
Вопрос заданболее трёх лет назад
-
2428 просмотров
Пригласить эксперта
Читайте задание внимательнее.
Попробуйте в голове разложить алгоритм простыми словами.
1. Передаем в функцию число num (например, 9)
2. Создаем переменную acc с начальным значением 2 (1 нам не нужно)
3. Делим num на acc.
4. Делиться без остатка? (9 % 2) Это наименьший делитель, возвращаем его.
5. Не делиться? Добавляем к acc +1 и пробуем еще раз.
6. Дошли до acc = num? Возвращаем num.
Соответственно, с пункта 2 по 6 — это рекурсия, которая работает с acc.
-
Показать ещё
Загружается…
28 мая 2023, в 08:16
5000 руб./за проект
28 мая 2023, в 07:29
1500 руб./за проект
28 мая 2023, в 02:05
7000 руб./за проект
Минуточку внимания
Всем привет!
Есть задачка по нахождению наименьшего делителя, при этом нужно использовать императивный итеративный процесс, т.е. как я понимаю:
— не использовать рекурсию
— использовать переменные
— использовать цикл while
Решил я таким образом:
———————————————
Javascript | ||
|
———————————————
Дело в том, что при прохождении тестов ошибка, если подать на вход 121 — на выходе 7 и программа завершается.. не понимаю почему?
Если же изменить решение на такое:
——————————————-
Javascript | ||
|
——————————————-
Все отлично. НО! я не понимаю в чем принципиальное отличие и почему в первом варианте fail..
P.S. Как понимаете в этом я совсем новичок, так что сильно не пинайте и по возможности объясните проще)))
Спасибо за помощь)!
22.05.2017, 18:50 |
|||
|
|||
функция нахождения наименьшего делителя числа итеративный процесс 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 и смотрит если делит без остатка то все ок и возвращает делитель |
22.05.2017, 19:14 |
|||
|
|||
Нет меня интересовало почему в моем коде происходит undefined |
22.05.2017, 19:38 |
||||
|
||||
Функция это не цыкл в котором есть условие завершение итераций. (ваш К.О.) |
22.05.2017, 19:54 |
||||
|
||||
if (result === 0) в смысле? result она считает за функцию? А не результат вычисления num % denominator ? |
23.05.2017, 11:25 |
|||
|
|||
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 |
23.05.2017, 11:45 |
||||
|
||||
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); |
23.05.2017, 12:42 |
||||
|
||||
А как сделать чтоб сравнить результат? В описании функции я же писал вернуть значение вычисленного return (num % denominator); |