Вопрос №55233 от пользователя Сергей в уроке «Итеративный процесс», курс «Введение в программирование»
подскажите мы должны как то определять acc в задаче? какой нибудь константой или функцией? 3 день сижу не хочу лезть в подсказку. для чего вообще нужно подставлять acc - читаю обсуждения и похоже все понимают, для чего оно кроме меня. оно вшито в решении задачи?
Константа acc
- это аккумулятор, он хранит текущий результат и помогает передать его дальше. Вы должны задать первоначальное значение аккумулятора, вызвав с ним внутреннюю рекурсивную функцию. Посмотрите в теории на пример с факториалом. Можете отправить свое решение (что у вас сейчас получается) на ревью и выложить ссылку? Подробнее о ревью: https://help.hexlet.io/ru/articles/111135-kod-revyu
Help, на верном ли я пути? читаю мысли простых людей, собираю пазл... вроде как в голове картинка проявляется, но не совсем понимаю куда воткнуть условие про наличие целого остатка
Сергей, попробуйте прямо здесь описать словами, по шагам, алгоритм решения этой задачи. Так вам самому будет проще выстроить в голове все мысли
есть число которое больше 0. то что число делится на само себя - нам не нужно. далее перебираем все числа, которые при делении выдают целое число и выводим самое меньшее в ответ
Посмотрите на вывод тестов:
Expected: 3
Received: undefined
Как думаете, в каком случае функция возвращает undefined
? Посмотрите в теории урока, что должна возвращать внешняя функция. Также обратите внимание, что если число не делится нацело на делитель, остаток от деления может быть не только меньше, но и больше нуля.
уже начинаю врубаться так, вроде как понял про базовый результат, прописал сценарии, но ругается на "инвалидную левую часть", что-то с синтаксисом
Сергей, вернитесь к шестой версии ревью, это решение близко к истине. Вам нужно только поправить два момента:
- Вернуть из основной функции вызов внутренней рекурсивной функции с начальным значением делителя (посмотрите пример в теории).
- Разобраться с проверкой на то, что число делится нацело на делитель. Сейчас есть проверка только на то, что остаток от деления меньше нуля. Можно проверить, что остаток от деления не равен нулю, и эта проверка покроет оба случая: и когда остаток больше нуля и когда меньше
Вы скидываете ссылку на само упражнение, а не на код-ревью. Если актуальной сейчас является 11 версия ревью, то вынужден повторить свой предыдущий комментарий. Шестая версия ревью наиболее близка к правильному решению. Поправьте два момента, которые я описал в предыдущем комментарии, и код заработает.
Максим Литвинов, я вернулся к 6 превью, посмотрел еще раз урок насчет каунтер и acc. Возможно ли, что мне нужно ввести в итер еще один аргумент для сохранения результата от вычисления (num % delitel)? понимаю что это запоздалая мысль, но все таки... просто тогда вся наработка идет коту под хвост
Сергей, вы уходите в дебри. Почему вы не хотите взять за основу шестую версию. Просто скопируйте её и поправьте моменты, которые я вам подсказал.
- Нужно поправить второе условие. Если остаток от деления числа на делитель не равен нулю, то вызываем iter со следующим делителем delitel + 1. Если остаток от деления не равен нулю, значит число нацело не делится, пробуем следующий делитель.
- В конце из основной функции smallestDivisor нужно вернуть вызов iter с начальным делителем 2. Мы же должны начать делить с какого-то числа.
Максим Литвинов, нашел же решение но почему то не работает. может ошибка в выведение базовой функции в конце, не поставил какой-то знак
- Обратите внимание, что оператор сравнения - это
===
, а=
это оператор присваивания. - Повторю свой предыдущий комментарий. Сейчас функция smallestDivisor ничего не возвращает. Нужно вернуть из неё вызов внутренней функции iter() с аргументом 2
Максим Литвинов, изменил оператор на присваивание(https://ru.hexlet.io/code_reviews/414971) и вызов внутренней функции, как я думаю, но увы
Сергей, нужно было сделать наоборот. Там, где вы сравниваете значение константы с числом, нужно ставить оператор сравнения. Например, здесь: if (num = 1)
вы проверяете, что значение num равно 1, т.е. вы сравниваете значение num и единицу. Тут нужен оператор сравнения: if (num === 1).
С вызовом внутренней функции теперь все правильно, вы вызываете его с аргументом 2. Еще обратите внимание на это условие:
if (num % delitel = 0)
Не нужно возвращать здесь рекурсивный вызов. Оставьте это условие, как было в предыдущей версии ревью. Ведь если число делится на делитель без остатка, значит, делитель найден и нужно просто вернуть его.
Максим Литвинов, строкой перед //end мы вызываем return (делитель)? ведь сама итерация уже закончилась и мы "закрываем" её
Эта строка return deletel;
не нужна, до неё вряд ли когда-нибудь дойдет исполнение. Условия выше покрывают все возможные случаи и хотя бы одно из них выполнится. Чтобы все заработало, вам нужно сделать в самом конце в функции smallestDivisor сделать возврат return iter(2)
и заменить еще в одном месте присваивание на сравнение (num % delitel = 0)
Максим Литвинов, побольше тебе здоровья, мил человек
Используйте Хекслет по максимуму!
- Задавайте вопросы по уроку
- Проверяйте знания в квизах
- Проходите практику прямо в браузере
- Отслеживайте свой прогресс
Зарегистрируйтесь или войдите в свой аккаунт
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.







