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

от автора

Получил вот такой результат на правильный вариант ответа

Получил вот такой результат на правильный вариант ответа

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

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

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

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

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

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

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

Ладно, открываем 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

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

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


ссылка на оригинал статьи https://habr.com/ru/articles/737602/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *