遞迴:函式自己呼叫自己
函式一旦進入遞迴,可能需要很多次呼叫才能遞迴結束。(呼叫關係會非常複雜)
由於是同乙個函式呼叫自己,每次呼叫執行的**都很相似,涉及到的區域性變數的名字也都一樣,就會特別容易讓人混淆。
先舉乙個簡單的例子:
求n的階乘
**如下(示例):
#include
#include
//這是求階乘的普通做法
intfactor
(int n)
return result;
}int
main()
這是求階乘的遞迴做法
注意:函式呼叫過程中,引數都叫n,雖然名字相同,但是是完全不同的變數,一定要結合具體的呼叫層數,來確定當前n的值是幾。
例項2:
接受乙個整型值(無符號),按照順序列印它的每一位。
例如:輸入:1234
輸出:1 2 3 4
解題思路:
如何取出整數的每一位?
1234%10=>4
1234/10=>123
123%10=>3
123/10=>12
12%10=>2
12/10=>1
1%10=>1
思路:針對整數對10求餘數,求出的結果就是個位,然後再/=10,再迴圈的對10求餘數。
如果按照上面的過程來取,結果是4 3 2 1,是反著的。使用遞迴就可以很方便的解決這個問題。
**如下(示例):
#include
#include
void
printnum
(int n)
printf
("%d\n"
,n %10)
;}intmain()
例項3:編寫函式不允許建立臨時變數,求字串長度。
求字串長度的思路就是,從前往後遍歷字元陣列,每次讀取到乙個字元就count++,遇到』\0』就迴圈結束
**如下(示例):
/這是非遞迴的做法/
#include
#include
intstrlen
(char str)
return count;
}int
main()
/遞迴版本求字串長度(沒有臨時變數)/
int
strlen
(char str)
return1+
strlen
(str +1)
;}
例項4:求第n個斐波那契數。
#include
#include
intfib
(int n)
if(n ==2)
return
fib(n -1)
+fib
(n -2)
;}intmain()
剛剛發現fib(40),算了一會還是算出來了,fib(50)算了半天還沒算出來。
原因就是fib(50)的計算量遠遠大於fib(40)的計算量。計算量大的原因是進行了大量的重複計算。此處採取的優化辦法,不使用遞迴,就是用單純的迴圈來計算。
int
fib(
int n)
if(n ==2)
//接下來直接使用迴圈來計算
//這兩變數分別表示第i-1項和第i-2項
int last1 =1;
int last2 =1;
//此處cur表示當前的第i項
int cur =0;
for(
int i =
3; i <= n; i++
)}
python遞迴函式例項 python遞迴函式
python遞迴函式 什麼是遞迴?遞迴,就是在函式執行中自己呼叫自己 示例 def recursion n 定義遞迴函式 print n 列印n recursion n 1 在函式的執行種呼叫遞迴 recursion 1 呼叫函式 這個函式在不斷的自己呼叫自己,每次呼叫n 1,看下執行結果 998t...
php遞迴函式及簡單例項講解
遞迴函式即自呼叫函式,在函式體內部直接或者間接的自己呼叫自己,即函式的巢狀呼叫是函式本身。通常在此型別的函式提之中會附加乙個條件判斷敘述,以判斷是否需要執行遞迴呼叫,並且在特定的條件下終止函式的遞迴呼叫動作,把目前流程的主控權交回到上一層函式來執行。以此,當某個執行遞迴呼叫的函式沒有附加條件判斷敘述...
遞迴演算法例項
如 求1 2 3 4 n 1.方法 public static int operation int n 注意返回值和引數 2.根據提議,當值為1時表示不再遞迴,那麼此處定義為程式出口,即 if n 1 如果未到達出口,那麼進行遞迴運算 else if n 1 這裡注意的地方有 operation n...