斐波那契数列
参考:剑指offer
- 写一个函数,输入n, 求斐波那契数列的第n项。
- 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法。
- 我们可以用2×1的小矩形横着或竖着去覆盖更大的矩形。请问用8个2×1的小矩形横着或竖着无重复地覆盖一个2×8的大矩形,总共有多少种方法。
1、思路:
不建议用递归,因为会重复计算。依次叠加往上计算,动态规划的思想。
Fib
1 #include <stdio.h> 2 3 long long Fib(unsigned int n) 4 { 5 int result[2] = {0, 1}; 6 if (n < 2) 7 return result[n]; 8 long long num1 = 0; 9 long long num2 = 1; 10 long long temp; 11 for (unsigned int i = 2; i <= n; i++) 12 { 13 temp = num2; 14 num2 = num1 + num2; 15 num1 = temp; 16 } 17 return num1; 18 } 19 20 int main() 21 { 22 int n = 6; 23 int result = Fib(n); 24 printf("result: %d\n", result); 25 }
2、思路:
首先考虑简单情况。1级台阶,只有1种跳法;2级台阶,只有2种跳法;3级台阶,有3中跳法;4级台阶,有5种跳法...
再来讨论一般情况。f(n)表示n级台阶的跳法。对于n级台阶的最后一跳有两种选择:当最后一跳是1级时,此时跳法数目等于前面的n-1级台阶的跳法数目;当最后一跳是2级时,此时跳法数目等于前面的n-2级台阶的跳法数目。所以f(n)=f(n-1)+f(n-2),就是斐波那契数列。
3、思路:
我们把2×8的覆盖方法记为f(8)。用第一个小矩形去覆盖大矩形的最左边有两种选择,一种是竖着放,右边剩下2×7的区域;另一种是横着放,右边剩下2×6的区域。所以f(8)=f(7)+f(6)。