Как стать автором
Обновить

Академия Яндекса. Мы в рекурсии случайно

Время на прочтение2 мин
Количество просмотров3.3K
Получил вот такой результат на правильный вариант ответа
Получил вот такой результат на правильный вариант ответа

Сижу, читаю канал по питону. Замечаю вот такое:

Вроде ирония, а вроде реально косяк в рекурсии. Полез разобраться.
Вроде ирония, а вроде реально косяк в рекурсии. Полез разобраться.

Открываю сайт академии, там задачка, поправить эту рекурсию.

По комментариям к статье посоветовали более подробно описать задачу. На сайте Академии Яндекса она сформулирована вот так:

Вот варианты которые были предложены по нажатию кнопки "Исправить"

Выбрал последний вариант ответа. Получаю ответ, что выбрал неверно.

Ладно, открываем R, поехали проверять.

options(scipen=999)

factorial <- function(n) {

if(n==1) {

return(1)

}

return(n*factorial(n-1))

}

factorial(2)
[1] 2
factorial(3)
[1] 6
factorial(4)
[1] 24
factorial(5)
[1] 120
factorial(6)
[1] 720
factorial(7)
[1] 5040
factorial(8)
[1] 40320
factorial(9)
[1] 362880
factorial(10)
[1] 3628800
factorial(11)
[1] 39916800
factorial(12)
[1] 479001600
factorial(13)
[1] 6227020800
factorial(14)
[1] 87178291200
factorial(15)
[1] 1307674368000
factorial(16)
[1] 20922789888000
factorial(17)
[1] 355687428096000
factorial(18)
[1] 6402373705728000
factorial(19)
[1] 121645100408832000

Напоминаю, что это решение "не верное".

с точки зрения Академии яндекса вы выбрали неправильное решение # наше такое:

def factorial(n):

if n == 0:

return 1

return n * factorial(n - 1)

Хорошо, сейчас реализуем.

factorial_akademiya_yandeksa <- function(n) {

if(n==0) {

return(1)

}

return(n*factorial(n-1))

}

factorial_akademiya_yandeksa(2)
[1] 2
factorial_akademiya_yandeksa(3)
[1] 6
factorial_akademiya_yandeksa(4)
[1] 24
factorial_akademiya_yandeksa(5)
[1] 120
factorial_akademiya_yandeksa(6)
[1] 720
factorial_akademiya_yandeksa(7)
[1] 5040
factorial_akademiya_yandeksa(8)
[1] 40320
factorial_akademiya_yandeksa(9)
[1] 362880
factorial_akademiya_yandeksa(10)
[1] 3628800
factorial_akademiya_yandeksa(11)
[1] 39916800
factorial_akademiya_yandeksa(12)
[1] 479001600
factorial_akademiya_yandeksa(13)
[1] 6227020800
factorial_akademiya_yandeksa(14)
[1] 87178291200
factorial_akademiya_yandeksa(15)
[1] 1307674368000
factorial_akademiya_yandeksa(16)
[1] 20922789888000
factorial_akademiya_yandeksa(17)
[1] 355687428096000
factorial_akademiya_yandeksa(18)
[1] 6402373705728000
factorial_akademiya_yandeksa(19)
[1] 121645100408832000

Отличий по результату у "неверного" и "верного" решений не нашел.

То, что оба решения уходят в бесконечный цикл на отрицательных значениях это уже так, мелочи жизни, Как верно подметил @nulovkinif(n<2) return(1) ,проверка на тип int для n, на отрицательные значения? Всё это не нужно, какие мелочи.

И спасибо за комментарий @Tyusha:

"Вообще говоря, коль скоро исходная функция всегда возвращает ноль, то "исправление" это:

def factorial(n):
  return 0

Кто его знает, может быть цель именно такая?"

Похоже эти "Академики" не сильно хорошо разбираются в рекурсиях? Не стал бы я доверять им свою карьеру.

Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
Всего голосов 9: ↑3 и ↓6-1
Комментарии33

Другие новости

Работа

Data Scientist
53 вакансии

Ближайшие события