0

再帰では、メソッドは自分自身を呼び出します。戻り値がある場合、私はそれに従っていません。たとえば、Chris Pine の「Learn to Program」という本には、階乗に関するこの例があります。

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)呼び出します。、したがってと。factorial2num = 22 * factorial(2-1)2*1=2

6コードを最初に実行して得た はどうなるでしょうか? これで、コードの最後にnum = 1戻って移動するようになりました。1しかし、私の理解では、以前の再帰からまだ6あります。2を掛けたときに階乗関数を呼び出したので、この仮定は正しいnumですか? 誰かがこれをよりよく理解するのを手伝ってくれますか? に電話factorial(10)したとしましょう。これはどのように機能しますか?

4

3 に答える 3

4

コードを最初に実行して得た 6 はどうなるでしょうか。

最初の実行から 6 はありませんでした。6は最後にのみ登場しました。

これが起こることです:

factorial(3) → 3 * factorial(2)
factorial(3) → 3 * 2 * factorial(1)
factorial(3) → 3 * 2 * 1

関数には以前の呼び出しの「記憶」はありません。factorial() が呼び出されるたびに、まったく新しい関数のようになります。複数の関数として記述した方が明確ですか?

def factorialof3
  3 * factorialof2
end

def factorialof2
  2 * factorialof1
end

def factorialof1
  1
end
于 2013-05-21T05:07:22.347 に答える