關於遞迴的思考

2021-09-19 04:46:43 字數 1157 閱讀 8321

之前有接觸過遞迴,看到別人寫的遞迴函式的**,好生羨慕,怎麼就能寫這麼好呢?我怎麼就想不到這樣寫呢?如此等等。

就拿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級...