遞回應該放在漢諾塔問題之前講的,因爲漢諾塔問題就是用遞回解決的,所以今天補上!
遞回是個很基礎的知識點,我記得大學C語言的前面就講了遞回,可見遞回是個簡單卻又重要的知識點!
遞回的具體文字解釋,我就不說了,簡單來說,遞回就是不斷呼叫自己,直到達到終止條件。
所以, 遞回的兩個特點: 呼叫自身、結束條件
我就簡單句幾個例子說明一下:
1. def func1(x):
print(x)
func1(x-1)
沒有結束條件,我們都不知道到遞回什麼時候結束,所以不是合法的遞回
2. def func2(x):
if x > 0:
print(x)
func2(x+1)
看似有結束條件x>0,即當x<=0時結束,但x+1會永遠大於0,即依然不會結束,故相當於沒有結束條件,不是合法的遞回
所以,遞回是否有結束條件,不能只看程式碼裡是否有判斷條件,還要結合程式碼,判斷遞回結束條件是否有效
3. def func3(x):
if x > 0:
print(x)
func3(x-1)
是合法遞回
n的階乘=nx(n-1)x(n-2) x…x2x1
比如5的階乘即爲5x4x3x2x1=120
下面 下麪看看程式碼:
def func(n):
s = 0
if n == 1:
return 1
else:
s = n * func(n - 1)
return s
先定義s,來儲存階乘的乘積,再加結束條件。因爲階乘最多就是乘到1,所以我們判斷當n減到1時,就返回1,不然就一直呼叫自己本身。
舉個栗子——5:
5≠1,所以此時s=5*func(4);
再看func(4):
n=4≠1,所以func(4)=4*func(3),此時s=5*4*func(3);
再看func(3):
n=3≠1,所以func(3)=3*func(2),此時s=5*4*3*func(2);
再看func(2):
n=2≠1,所以func(2)=2*func(1),此時s=5*4*3*2*func(1);
再看func(1):
n=1,則此時函數返回1,即func(1)=1,所以此時s=5*4*3*2*1=120
再用程式驗證一下:
def func(n):
s = 0
if n == 1:
return 1
else:
s = n * func(n - 1)
return s
print(func(5))
結果爲120
,正確!