日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

剑指offer 算法 (递归与循环)

發布時間:2025/10/17 编程问答 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 剑指offer 算法 (递归与循环) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項。

class Solution { public:int Fibonacci(int n) { if(n==0)return 0;else if(n==1)return 1;else// return Fibonacci(n-1)+Fibonacci(n-2);{int *array;array=(int*)malloc(n*sizeof(int));array[0]=0;array[1]=1;for(int i=2;i<n;i++){array[i]=array[i-1]+array[i-2]; }return (array[n-1]+array[n-2]);}} };

題目描述


一只青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法。

解析:當n = 1, 只有1中跳法;當n = 2時,有兩種跳法;當n = 3 時,有3種跳法;當n = 4時,有5種跳法;當n = 5時,有8種跳法;.......規律類似于Fibonacci數列

class Solution { public:int jumpFloor(int number) {if(number==1)return 1;if(number==2)return 2;elsereturn jumpFloor(number-1)+jumpFloor(number-2);} };題目描述

一只青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。

解析:用Fib(n)表示青蛙跳上n階臺階的跳法數,青蛙一次性跳上n階臺階的跳法數1(n階跳),設定Fib(0) = 1;
當n = 1 時, 只有一種跳法,即1階跳:Fib(1) = 1;
當n = 2 時, 有兩種跳的方式,一階跳和二階跳:Fib(2) = Fib(1) + Fib(0) = 2;
當n = 3 時,有三種跳的方式,第一次跳出一階后,后面還有Fib(3-1)中跳法; 第一次跳出二階后,后面還有Fib(3-2)中跳法;第一次跳出三階后,后面還有Fib(3-3)中跳法
Fib(3) = Fib(2) + Fib(1)+Fib(0)=4;
當n = n 時,共有n種跳的方式,第一次跳出一階后,后面還有Fib(n-1)中跳法; 第一次跳出二階后,后面還有Fib(n-2)中跳法..........................第一次跳出n階后, 后面還有 Fib(n-n)中跳法.
Fib(n) = Fib(n-1)+Fib(n-2)+Fib(n-3)+..........+Fib(n-n)=Fib(0)+Fib(1)+Fib(2)+.......+Fib(n-1)
又因為Fib(n-1)=Fib(0)+Fib(1)+Fib(2)+.......+Fib(n-2)
兩式相減得:Fib(n)-Fib(n-1)=Fib(n-1) => Fib(n) = 2*Fib(n-1) (n >= 2)

class Solution { public:int jumpFloorII(int number) {if(number==0||number==1)return 1;elsereturn 2*jumpFloorII(number-1);} };
題目描述

我們可以用2*1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法? class Solution { public:int rectCover(int number) {if(number==1)return 1;if(number==2)return 2;else return rectCover(number-1)+rectCover(number-2);} };
題目描述

我們可以用2*1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2*1的小矩形無重疊地覆蓋一個2*n的大矩形,總共有多少種方法?

解析:觀察題目中的矩形,2*n的,是個長條形。既然只是簡單的長條形,那么依然逆向分析。既然是長條形的,那么從后向前,最后一個矩形2*2的,只有兩種情況:   第一種是最后是由一個2*(n-1)的矩形加上一個豎著的2*1的矩形  另一種是由一個2*(n-2)的矩形,加上兩個橫著的2*1的矩形  因此我們可以得出,  第2*n個矩形的覆蓋方法等于第(n-1)個2*1的小矩形加上第(n-2)個2*1的小矩形方法。

class Solution { public:int rectCover(int number) {if(number==0)return 1;else if(number==1)return 1;else if(number==2)return 2;else return rectCover(number-1)+rectCover(number-2);/*unsigned int array[71]={1,1,2};for(int i=3;i<71;i++){array[i]=array[i-1]+array[i-2];}return array[number];*/} };


總結

以上是生活随笔為你收集整理的剑指offer 算法 (递归与循环)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。