鍍金池/ 問答/Python  C++/ python遞歸的問題?

python遞歸的問題?

最近學習 python,遇到一個遞歸的問題。學習遞歸最容易理解就是裴波那契數(shù)列,這個我能理解,但是遇到了一個算階乘的問題, 想不通看代碼。

def func(a1):
    if a1 == 5:
        return a1
    return a1 * func(a1 + 1)

print (func(1))

這個遞歸如果是簡單的 return func(a1 + 1) 我還好理解,但是加上這個 a1 * 之后我就懵逼了。

我的理解:

調(diào)用函數(shù)第一次進來 a1 = 1, 不等于 5 走下面直接得到一個 a1 * func(a1 +1) 相當于 1 * func(2) 這里因為是 return 的值所以結(jié)果是要返回的,2 就是第一個的返回值,這時候 a1 = 2 繼續(xù)調(diào)用相當于 2 * (a1 + 1)(這時候 a1 = 2 了),那這個返回值就是 6 了, 2*6=12, a1=12, 繼續(xù)調(diào)用 12*13?

我這個算法感覺有點小牛逼,但是覺得我理解的也沒啥問題,就是拿返回值繼續(xù)套嘛,所以懵逼了o(╯□╰)o

哪位小哥哥幫我捋一捋不勝感激。

回答
編輯回答
笑忘初

你把這個看成一個數(shù)學問題
階乘是什么?
f(1) = 1
f(n) = n * f(n-1)
所以就是

def f(n):
  if n <= 0:
    return 0
  if n == 1:
    return 1
  return n * f(n-1)
2017年8月6日 18:44
編輯回答
笑忘初

觀察代碼可知,此函數(shù)是從1開始遞增計算a1的階乘。以a1=5為例,算法邏輯如下:
1 當傳入?yún)?shù)a1!=5時,進入return a1 * func(a1 + 1)語句。
2 當傳入?yún)?shù)a1 ==5時,直接返回a1的值,此時遞歸計算結(jié)束。
所以,這個函數(shù)的運算步驟為:
loop1 :1*func(1+1);
loop2: func(1+1)=2*func(2+1);
loop3: func(2+1)=3*func(3+1);
loop4: func(3+1)=4*func(4+1);
loop5: func(4+1)=5;
最終結(jié)果為:12345=120

2018年3月16日 00:54
編輯回答
清夢

這個程序其實就是執(zhí)行 12345 = 120
執(zhí)行的步驟就是:

  • 輸入a1=1
  • func(1) = 1func(2) 此時需renturn 1func(2)的值
  • func(2)的值暫時不知道,就再跑上面這個函數(shù),func(2) = 2*func(3)
    其實本質(zhì)上就等于 func(1) = 12fun(3)
  • func(3)的值也不知道,繼續(xù)計算,func(3) = 3func(4),相當于func(1)=123func(4)
  • 繼續(xù)func(4),func(1) = 1234func(5)
  • 函數(shù)中有判斷條件 if a1 == 5 return a1, 此時a1=5,所有func(5) = 5
  • 所以func(1) = 12345 = 120
2017年5月5日 16:42