題目1:斐波那契數列
大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0)。 n<=39斐波那契數列定義:
1、1、2、3、5、8、13、21、34、……
我們最容易想到的是遞迴的方式,**如下:
public int fibonacci(int n)
if(n==1)
return fibonacci(n-1)+fibonacci(n-2);
}
但這並不是最優解,有很嚴重的效率問題。
改進:
從下往上計算,首先根據f(0),f(1)算出f(2),再根據f(1)f(2)算出f(3)…以此類推算出第n項。實現**如下:
public int fibonacci(int n) else if(n==1||n==2)else
return fibn;
}
}
題目2:跳台階
乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個n級的台階總共有多少種跳法(先後次序不同算不同的結果)。a.如果兩種跳法,1階或者2階,那麼假定第一次跳的是一階,那麼剩下的是n-1個台階,跳法是f(n-1);
b.假定第一次跳的是2階,那麼剩下的是n-2個台階,跳法是f(n-2)
c.由a\b假設可以得出總跳法為: f(n) = f(n-1) + f(n-2)
d.然後通過實際的情況可以得出:只有一階的時候 f(1) = 1 ,只有兩階的時候可以有 f(2) = 2
e.可以發現最終得出的是乙個斐波那契數列
**同上。
題目3:**跳台階
乙隻青蛙一次可以跳上1級台階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上乙個n級的台階總共有多少種跳法。f(1) = 1
f(2) = f(2-1) + f(2-2) //f(2-2) 表示2階一次跳2階的次數。
f(3) = f(3-1) + f(3-2) + f(3-3)
…f(n) = f(n-1) + f(n-2) + f(n-3) + … + f(n-(n-1)) + f(n-n)
進行簡化:
f(n-1) = f(0) + f(1)+f(2)+f(3) + … + f((n-1)-1) = f(0) + f(1) + f(2) + f(3) + … + f(n-2)
f(n) = f(0) + f(1) + f(2) + f(3) + … + f(n-2) + f(n-1) = f(n-1) + f(n-1)
可以得出:
f(n) = 2*f(n-1)
總的跳法為:
1 , (n=0 )
f(n) = 1 , (n=1 )
2*f(n-1), (n>=2)
**如下:
public int jumpfloorii(int target) else
}
題目4:矩形覆蓋
我們可以用21的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個21的小矩形無重疊地覆蓋乙個2*n的大矩形,總共有多少種方法?先把28的覆蓋方法記為f(8).
用第乙個小矩形去覆蓋最左邊時有兩種選擇:
豎著放:右邊還剩27區域,覆蓋方法記為f(7)。
橫著放:右邊還剩2*6區域,覆蓋方法記為f(6)。
因此f(8)=f(7)+f(6) 仍是斐波那契數列。
**如下:
public int rectcover(int target) else
}
跳台階問題 斐波那契數列
本篇文章有兩道題。對於本題,前提只有 一次 1階或者2階的跳法。a.如果兩種跳法,1階或者2階,那麼假定第一次跳的是一階,那麼剩下的是n 1個台階,跳法是f n 1 b.假定第一次跳的是2階,那麼剩下的是n 2個台階,跳法是f n 2 c.由a b假設可以得出總跳法為 f n f n 1 f n 2...
青蛙跳台階(斐波那契數列應用)
1 乙隻青蛙一次可以跳上 1 級台階,也可以跳上2 級。求該青蛙跳上乙個n 級的台階總共有多少種跳法。2 乙隻青蛙一次可以跳上1級台階,也可以跳上2 級 它也可以跳上n 級,此時該青蛙跳上乙個n級的台階總共有多少種跳法?問題1 題目描述 乙隻青蛙一次可以跳上1級台階,也可以跳上2級。求該青蛙跳上乙個...
C 實現斐波那契數列 青蛙跳台階
題目 寫乙個函式,輸入n,求斐波那契 fibonacci 數列的前n項。斐波那契數列的定義如下 1 方法1 迴圈的實現方法 include using namespace std int main int main int num 50 int data new int num memset dat...