遞迴,斐波那契數及其取模運算

2021-08-10 05:05:38 字數 1915 閱讀 4029

一、遞迴

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。輸出格式 輸出一行,...