一、什麼是遞歸函數
(1)遞歸函數即自調用函數,在函數内部直接或間接地自己調用自己,即函數的嵌套調用是函數本身。
從字面上來看遞歸,遞即遞推,采用循環的思路來描述複雜問題的方法。在遞推階段每一個遞歸調用通過進一步調用自己來記住這次遞歸過程,當其中調用滿足終止條件時,遞推結束。歸即回歸,函數調用已逆序的方式回歸,知道最初調用的函數返回為止,此時遞歸過程結束。舉個例子:
加群466572167,群内有資料學習
加群466572167,群内有C/C 資料學習
這裡有一個問題一定要注意,就是static int sum = 0;
有些人就不明白,為什麼要使用 static 類型修飾符,為什麼不使用 int sum=0;?如果使用 int sum=0; 這樣的語句,在每次調用函數add()的時候,sum的值都是賦值為0,也就是第一步雖然加了1上來,可是第二次調用的時候,sum又回到了0。我們前面說了,static能保證本次初始化的值是上次執行後的值,這樣也就保證了前面想加的結果不會丢失。如果你修改為int sum=0,最後結果一定是最後結果是5而不是15。
加群466572167,群内有C/C 資料學習
上面的例子就很好的解釋了,被調用函數運行的棧空間獨立于調用函數的棧空間 這句話。
三、遞歸調用的形式
遞歸函數有直接遞歸調用和間接調用兩種形式.
直接遞歸即在函數出現調用函數本身,例如:
加群466572167,群内有C/C 資料學習
間接遞歸調用指函數中調用其他函數,而該其他函數卻又調用了本函數。例如:
加群466572167,群内有C/C 資料學習
下面,再擴展一種遞歸,尾遞歸
當遞歸調用是整個函數中最後執行的語句且它的返回值不屬于表達式的一部分時,這個遞歸調用就是尾遞歸的。
上面的直接遞歸例子的返回值是 return num*func(num-1); 是一個表達式自然不是尾遞歸了,将其改為尾遞歸:
加群466572167,群内有C/C 資料學習
當編譯器檢查到一個函數是尾遞歸的時候,它就會覆蓋當前活躍記錄而不是在棧中去創建一個新的,這樣就解決了普通遞歸函數占用棧空間過大的問題。遺憾的是,大多數編程語言沒有針對尾遞歸做優化,所以,即使把函數改成尾遞歸方式,也會導緻棧溢出。
小編就暫時把遞歸說到這,加小編的群466572167,群内有C/C 資料學習,下一篇的話繼續接上,内容還是講遞歸吧,基于太多,一下子寫太多的話,各位看了也會累。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!