经典算法(二)斐波那契数列问题
n级台阶,一次可登1级或2级,问共有多少种不同的走法?
分析:
如果用n表示台阶的级数,a n表示某人走到第n级台阶时,所有可能不同的走法,容易得到:
(1)根据题意得:
当n=1时,显然只要1种跨法,即a1=1.
当n=2时,可以一步一级跨,也可以一步跨二级上楼,
因此,共有2种不同的跨法,即a2=2.
(2)当n=3时,由(1)可得:
如果第一步跨一级台阶,那么还剩下二级台阶,有a2=2(种)跨法.
如果第一步跨二级台阶,那么还剩下一级台阶,有a1=1(种)跨法.
因此,a3=a1+a2=3
(3)当n=4时,分三种情况分别讨论:
如果第一步跨一级台阶,那么还剩下三级台阶,有a3=3(种)跨法.
如果第一步跨二级台阶,那么还剩下二级台阶,有a2=2(种)跨法.
因此 a4=a3+a2=5
(4)当n=5时,分4种情况分别讨论:
如果第一步跨一级台阶,那么还剩下四级台阶,有a4=5(种)跨法.
如果第一步跨二级台阶,那么还剩下三级台阶,有a3=3(种)跨法.
因此a5=a3+a4=8
int func(int n) { if (1 == n) return 1; else if (2 == n) return 2;
return func(n - 1) + func(n - 2); }
尾递归实现
int Fibonacci(int n, int a, int b) { if (n<=2) { return b; } else { return Fibonacci(n-1, b, a+b); } }
循环实现
public static int fibonacciNormal(int n) { if(n==1){ return 1; } if (n == 2) { return 2; } int n1 = 1, n2 = 1, result = 0; for (int i = 3; i < n; i++) { result = n1 + n2; n1 = n2; n2 = result; } return result; }