剑指offer 算法 (递归与循环)
題目描述
大家都知道斐波那契數(shù)列,現(xiàn)在要求輸入一個(gè)整數(shù)n,請(qǐng)你輸出斐波那契數(shù)列的第n項(xiàng)。
題目描述
一只青蛙一次可以跳上1級(jí)臺(tái)階,也可以跳上2級(jí)。求該青蛙跳上一個(gè)n級(jí)的臺(tái)階總共有多少種跳法。
解析:當(dāng)n = 1, 只有1中跳法;當(dāng)n = 2時(shí),有兩種跳法;當(dāng)n = 3 時(shí),有3種跳法;當(dāng)n = 4時(shí),有5種跳法;當(dāng)n = 5時(shí),有8種跳法;.......規(guī)律類(lèi)似于Fibonacci數(shù)列
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級(jí)臺(tái)階,也可以跳上2級(jí)……它也可以跳上n級(jí)。求該青蛙跳上一個(gè)n級(jí)的臺(tái)階總共有多少種跳法。
解析:用Fib(n)表示青蛙跳上n階臺(tái)階的跳法數(shù),青蛙一次性跳上n階臺(tái)階的跳法數(shù)1(n階跳),設(shè)定Fib(0) = 1;
當(dāng)n = 1 時(shí), 只有一種跳法,即1階跳:Fib(1) = 1;
當(dāng)n = 2 時(shí), 有兩種跳的方式,一階跳和二階跳:Fib(2) = Fib(1) + Fib(0) = 2;
當(dāng)n = 3 時(shí),有三種跳的方式,第一次跳出一階后,后面還有Fib(3-1)中跳法; 第一次跳出二階后,后面還有Fib(3-2)中跳法;第一次跳出三階后,后面還有Fib(3-3)中跳法
Fib(3) = Fib(2) + Fib(1)+Fib(0)=4;
當(dāng)n = n 時(shí),共有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)
又因?yàn)镕ib(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)
題目描述
我們可以用2*1的小矩形橫著或者豎著去覆蓋更大的矩形。請(qǐng)問(wèn)用n個(gè)2*1的小矩形無(wú)重疊地覆蓋一個(gè)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的小矩形橫著或者豎著去覆蓋更大的矩形。請(qǐng)問(wèn)用n個(gè)2*1的小矩形無(wú)重疊地覆蓋一個(gè)2*n的大矩形,總共有多少種方法?
解析:觀察題目中的矩形,2*n的,是個(gè)長(zhǎng)條形。既然只是簡(jiǎn)單的長(zhǎng)條形,那么依然逆向分析。既然是長(zhǎng)條形的,那么從后向前,最后一個(gè)矩形2*2的,只有兩種情況: 第一種是最后是由一個(gè)2*(n-1)的矩形加上一個(gè)豎著的2*1的矩形 另一種是由一個(gè)2*(n-2)的矩形,加上兩個(gè)橫著的2*1的矩形 因此我們可以得出, 第2*n個(gè)矩形的覆蓋方法等于第(n-1)個(gè)2*1的小矩形加上第(n-2)個(gè)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];*/} };
總結(jié)
以上是生活随笔為你收集整理的剑指offer 算法 (递归与循环)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 部分真题整理
- 下一篇: 剑指offer 算法(数组 字符串)