在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/Python  C++/ python遞歸的問(wèn)題?

python遞歸的問(wèn)題?

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

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

print (func(1))

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

我的理解:

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

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

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

回答
編輯回答
笑忘初

你把這個(gè)看成一個(gè)數(shù)學(xué)問(wèn)題
階乘是什么?
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開(kāi)始遞增計(jì)算a1的階乘。以a1=5為例,算法邏輯如下:
1 當(dāng)傳入?yún)?shù)a1!=5時(shí),進(jìn)入return a1 * func(a1 + 1)語(yǔ)句。
2 當(dāng)傳入?yún)?shù)a1 ==5時(shí),直接返回a1的值,此時(shí)遞歸計(jì)算結(jié)束。
所以,這個(gè)函數(shù)的運(yùn)算步驟為:
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
編輯回答
清夢(mèng)

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

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