题目为: 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
分析: N级=(N-1)级的情况+(N-2)级的情况。
因为两种情况都可以选择,所以两种情况下的次数相加。
算法1.
最简单的递推实现代码为:
long long Jump(int n)
{if (n == 0) return 0;if (n == 1) return 1;if (n == 2) return 2;return Jump(n - 1) + Jump(n - 2);
}
算法2.
很明显我们可以利用动态规划优化一下,这样可以省去大量的重复计算。
/*
1.最优子结构性质存在
2.重叠子问题存在,子问题的解答记录在count数组中,
*/
long long Jump(int n, long long count[])/*count数组初始值全部设为0*/
{if (n == 0) return 0;if (n == 1) return 1;if (n == 2) return 2;if (count[n] == 0)count[n] = Jump(n - 1, count) + Jump(n - 2, count);elsereturn count[n];return count[n];
}
算法3.
我们如果单纯从代码结构部分分析,这个一个Fibonacci数列,因此代码又可以改变为:
long long Jump(int n)
{long long a = 1, b = 2;long long temp;for (int i = 3; i <= n; i++){temp = a + b;if (i & 1 == 1)a = temp;else b = temp;}return temp;
}