В рекурсии метод вызывает сам себя. Я не слежу за ним, когда есть возвращаемые значения. Например, в книге «Учитесь программировать» Криса Пайна есть пример с факториалами.
def factorial num
if num < 0
return 'You cant\'t take the factorial of a negative number!'
end
if num <= 1
1
else
num * factorial(num-1)
end
end
Если я вызову метод factorial(3)
, он перейдет к else
части кода и будет выглядеть так:
3 * factorial(3-1)
и должен вернуть 6
с 3*2=6
. factorial(3-1)
вызывает метод factorial
, передавая 2
внутри рекурсии. num = 2
и, следовательно, 2 * factorial(2-1)
и 2*1=2
.
Что происходит с 6
, полученным при первом прогоне кода? Теперь, когда num = 1
, похоже, теперь будет возвращаться 1
и переходить к концу кода. Но, насколько я понимаю, у нас все еще есть 6
и 2
из предыдущих рекурсий. Прав ли я в этом предположении, так как мы вызывали факториальную функцию, когда умножали на num
? Может ли кто-нибудь помочь мне понять это лучше? Скажем, мы позвонили factorial(10)
, как это сработает?
def fact(n) (1..n).inject(1) {|r,i| r*i } end
:) - person Nir Alfasi   schedule 21.05.2013