之前有接觸過遞迴,看到別人寫的遞迴函式的**,好生羨慕,怎麼就能寫這麼好呢?我怎麼就想不到這樣寫呢?如此等等。
就拿fibonacci函式來說吧,乙個普通的函式可能這樣寫:
def fib(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fib(n-1) + fib(n-2)
我看到這個函式的思考方式是這樣的:
1. 當n=0時:返回0
2. 當n=1時:返回1
3. 當n=2時:
1. 首先去呼叫n=1,返回1
2. 再去呼叫n=0,返回0
3. 把0和1相加返回1
4. 當n=3時:
1. 呼叫n=2
1. 呼叫n=1,返回1
2. 呼叫n=0,返回0
3. 相加返回1
2. 呼叫n=1,返回1
3. 把1和1相加返回2
5. 等等
想到這我頭都要爆了,徹底被人家的函式折服了,看來我是寫不成這麼好的函式了。
但我轉念一想,這個函式的本質是fibnacci序列,我何不回歸fibonacci本身呢?fibonacci用數學公式表示應該是這樣:
看到公式我恍然大悟,上面那個函式不就是根據這個公式直接翻譯的嘛!原來我一直思考都是順著函式的**思考,這樣肯定會覺得很難,
正確的思考方式應該是從演算法出發然後再寫**。
經過了上面的慘痛教訓看看我能不能寫出正確的fibonacci序列函式,分段函式的公式應該是這樣的:
那麼直接寫成**就應該是這樣的:
def fib_seq(n):
seq =
if n == 0:
else:
seq.extend(fib_seq(n-1))
return seq
def fib_seq(n):
seq =
if n > 0:
seq.extend(fib_seq(n-1))
return seq
哇,原來如此! F 中關於遞迴的思考
做電腦錢整整幾個小時終於搞懂了f 中的遞迴!終點是要把當前獲得的值,加入到記錄中並且傳遞到下一次的遞迴中。附上一小段f let originlist newlist let rec checkelemet originlist newlist match originlist with head t...
關於遞迴的一些思考
遞迴函式一般有兩種模式,請看下面。include define cutoff 3 void swap int a,int b void insertionsort int array,int len else array j 1 temp int median3 int a,int left,int...
演算法複習1 關於遞迴的思考
昨天在牛客上做了幾個遞迴的題目,分別是斐波那契數列,跳台階,跳台階,矩形覆蓋,這幾個題實際上是同乙個題。以下是題目 1.斐波那契數列 大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項 從0開始,第0項為0 n 39 2.跳台階 乙隻青蛙一次可以跳上1級台階,也可以跳上2級...