使用递归的地方太多,比如树的遍历等,这里只介绍涉及递归的算法,同时递归效率一般比较低,所以太复杂的运算在Java中容易内存溢出。
(1)斐波那契数列
算法思路:F(0) = 0;F(1) = 1;F(n)=F(n-1)+F(n-2)(n>1)
1、递归解法
Long Fibonacci(int n)
{
If(n< = 0)
Return 0;
If(n==1)
Retuen 1;
Return Fibonacci(n-1)+ Fibonacci(n-2)
}
大量重复计算
2、改进算法
Long Fibonacci(int n)
{
Long num1 = 0;
Long num2 = 1;
Long result = 0;
For(int I = 2;i<=n;i++)
{
Result = num1+num2;
Num1 = num2;
Num2 = result;
}
Return result;
}
代码见:https://github.com/yuanfuqiang456/LeetCode/blob/master/src/others/FibonacciList.java
(2)青蛙跳台阶问题
算法思路:
一个可以跳一个或者两个台阶F(n)=F(n-1)+F(n-2)
一次可以跳N个到1个台阶。则利用数学归纳法为2的n-1次方
若第一次选择跳1个,则剩下的有F(n-1)种跳法
若第一次选择跳2个,则剩下的有F(n-2)种跳法
……
F(n) = F(n-1)+F(n-2)+…F(1)
F(n-1) = F(n-2)+F(n-3)+..F(1)
(3)矩形覆盖问题
21的小矩形横着或者竖着去覆盖更大的矩形,如28的大矩形。有多少种方法。
矩形覆盖设2*8时候为f(8),若最左边竖着放,剩下为F(7)种,若横着放,剩下为F(6)种。仍然是斐波那契数列
网友评论