一、遞迴
1、遞迴:即函式自己呼叫自己,函式在呼叫時會進行引數例項化,開闢棧空間。
2、遞迴可簡化**的編寫。易讀。
3、遞迴必須設定遞迴出口,否則會出現死迴圈
4、遞迴過程需一直開闢棧空間,執行速度慢,效率低。且存在棧溢位問題
5、相比較,迭代(非遞迴)的執行效率更高些,且不會一直開闢棧空間和造成棧的溢位問題,但**書寫量大,易讀性低。
注:對乙個數取模等同於對構成那個數的每個數取模,
列:13=8+5=8+3+2 那麼 13%3=8%3+3%3+2%3=8%3+(3%3+2%3)%3
為防止每個數取模的和大於模數,所以每兩個數取模之和後再次取模
二、**例項解析(階乘,斐波那契數及其取模運算)
#include
#include
//54321輸出5 4 3 2 1的遞迴執行流程解析
//遞迴是按一層一層的順序執行的.
//只有當最內層執行結束後才執行上一層未執行的語句,每一層都為遞迴函式整體,但每層實際都不相同
//下列(num=5):
//第n次執行表式 print用pn表式
//第n次執行表式 printf用pfn表式
//從外層到內層的順序執行,只有當最內層執行結束後才接著執行上一層未執行的語句,因此最外層是最後執行結束的。
//(p1->( p2->(p3->(p4->(p5->pf5)->pf4->pf3)pf2)pf1)
//p2->(p3->(p4->(p5->pf5)->pf4->pf3)pf2
//p3->(p4->(p5->pf5)->pf4->pf3
//p4->(p5->pf5)->pf4
//p5->pf5
void print(int num)//num=5
printf("%d ",num%10);//5->4->3->2->1
}int main()
//斐波那契數執行過程(若遞迴有多個return語句可畫圖求解分析)
// change(5)//最終返回5,呼叫9次change()函式
// /3 + 2\
// change(4) change(3)
// / 2+1 \ / 1+1 \
// change(3) change(2) change(2) change(1)
// / 1+1 \ 1 1 1
//change(2) change(1)
// 1 1 //返回1結束本次呼叫
#include
#include
//斐波那契數:1+1+2+3+5+8 ....
int fbnqs(int num)//求第幾個數的數值,當數值》40時計算速率很慢
return fbnqs(num-1)+fbnqs(num-2);
//return fbnqs(num-1)%1007+fbnqs(num-2)%1007;//斐波那契數取模
}//對乙個數取模等同於對構成那個數的每個數取模,
//列:13%3=8%3+3%3+2%3=8%3+(3+2)%3
//為防止每個數取模的和大於模數,所以每兩個數取模之和後再次取模,再加上下個數的餘數,以此類推求出結果
//儲存每個斐波那契數取模後的數而不是斐波那契數
int fbnqsy(int num)//迭代法,對斐波那契數(999)取模(10007)
return c;
}int change(int num)//計算結成
return num*change(num-1);//遞迴,累乘
}int main()
遞迴 斐波那契
題 若一頭小母牛,從出生起第四個年頭開始每年生一頭母牛,按此規律,第n年有多少頭母牛?具體分析 1 分析題目 從出生起第四個年頭開始每年生一頭母牛 時間 年 未成熟母牛 頭 成熟母牛 頭 母牛總數 頭 1 1 0 1 2 1 0 1 3 1 0 1 4 0 1 1 5 1 1 2 6 2 1 3 7...
斐波那契遞迴
const fib1 n if n 0 else if n 1 else console.log fib1 5 函式呼叫順序 fib1 5 fib1 4 fib1 3 fib1 2 fib1 1 fib1 0 fib1 1 fib1 2 fib1 1 fib1 0 fib1 3 fib1 2 fib...
斐波那契數
入門訓練 fibonacci數列 時間限制 1.0s 記憶體限制 256.0mb 問題描述 fibonacci數列的遞推公式為 fn fn 1 fn 2,其中f1 f2 1。當n比較大時,fn也非常大,現在我們想知道,fn除以10007的餘數是多少。輸入格式 輸入包含乙個整數n。輸出格式 輸出一行,...