摘要:之前有接觸過遞歸,看到別人寫的遞歸函數的代碼,好生羨慕,怎么就能寫這么好呢我怎么就想不到這樣寫呢如此等等。
之前有接觸過遞歸,看到別人寫的遞歸函數的代碼,好生羨慕,怎么就能寫這么好呢?我怎么就想不到這樣寫呢?如此等等。
就拿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: seq.append(0) else: seq.extend(fib_seq(n-1)) seq.append(fib(n)) return seq
咦,這兩個append好像可以合并:
def fib_seq(n): seq = [] if n > 0: seq.extend(fib_seq(n-1)) seq.append(fib(n)) return seq
哇,原來如此!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38075.html
摘要:那假如我們用遞歸來描述這種情況呢定義基本情況其它情形所以在上述求和中的定義又用到了自己本身的定義,這就構成了遞歸。 說起遞歸,我覺得其實大部分人應該是不陌生的,遞歸廣泛存在于生活中。比如: showImg(https://segmentfault.com/img/remote/1460000007420204?w=294&h=450); The woman in this image ...
摘要:當我們希望能界定這二者之間的區別時,我們將第一種稱為純粹的函數式編程,后者稱為函數式編程。函數式編程我們的準則是,被稱為函數式的函數或方法都只能修改本地變量。另一種觀點支持引用透明的函數式編程,認為方法不應該有對外部可見的對象修改。 一、實現和維護系統 1.共享的可變數據 如果一個方法既不修改它內嵌類的狀態,也不修改其他對象的狀態,使用return返回所有的計算結果,那么我們稱其為純粹...
摘要:判斷兩棵樹是否是相同題目要求傳入兩棵樹的根節點,判斷這兩棵樹是否相同此題的核心就在于如何遍歷樹。定義樹的一種自然方式是遞歸的方式。一棵樹是一些節點的集合,這個集合可以是空集。這個遍歷算法可以用于場景如,計算一個節點的高度。 判斷兩棵樹是否是相同 題目要求:傳入兩棵樹的根節點,判斷這兩棵樹是否相同此題的核心就在于如何遍歷樹。一旦我們解決了這個問題,題目也就迎刃而解了。下面就來介紹一下 關...
摘要:終止條件遞推公式遞歸的分類通過做大量的題,根據遞歸解決不同的問題,引申出來的幾種解決和思考的方式。我們通過層與層之間的計算關系用遞推公式表達出來做計算,經過層層的遞歸,最終得到結果值。 showImg(https://segmentfault.com/img/remote/1460000019222330); 前言 幾個月之前就想寫這樣一篇文章分享給大家,由于自己有心而力不足,沒有把真...
閱讀 1698·2021-10-28 09:32
閱讀 605·2021-09-24 09:47
閱讀 2920·2021-09-02 15:11
閱讀 2733·2021-08-09 13:46
閱讀 2884·2019-08-30 15:55
閱讀 1071·2019-08-30 15:54
閱讀 3300·2019-08-29 14:12
閱讀 805·2019-08-26 13:40