青蛙跳台阶
青蛙跳台阶,青蛙每一次可以跳1阶或2阶,假设有n阶台阶,青蛙要跳完所有台阶,有多少种跳法?
引入斐波那契数列
对于斐波那契数列,百度百科是这么解释的:
斐波那契数列(Fibonacci sequence),又称数列、因·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从 1963 年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。
可以看出从第三个数开始,其数值都是由前两个数值相加而得来的,也就是F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)。
使用递归算法求解斐波那契数列某个值
程序调用自身的编程技巧称为递归( recursion)。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
public static void main(String args) {
System.out.println(method(14));
}
public static int method(int n) {
int sum = 0;
if(n
return 0;
else if(n==1)
return 1;
else
sum = method(n-1) + method(n-2);
return sum;
}
使用循环求解斐波那契数列某个值
递归算法解题相对常用的算法如普通循环等,运行效率较低。因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况,递归更为适合的时候。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。
找规律:
f(0) = 0, f(1) = 1;
当n=2(从0开始数)时,f(2) = f(1) + f(0) = 1;
当n=3时,f(3) = f(2) + f(1) = 2;
可以看出,当n>=2时,要求解的这个数,跟上一个数的结果以及相加的两个数中较大的那个数有关,即求解的这个数 = 上一个数的返回结果 + 上一个数中相加的两个数中较大的值。
用代码表示为:
int a=0;
int b=1;
int sum =0;
if(n
return 0;
else if(n==1)
return 1;
else
{
for(int i =0;i
sum = a + b;
// b是上一个数中较大的值,赋值给a
a = b;
// sum是上一个数的返回值
b = sum;
}
}
return sum;
处理青蛙
因为从第一节台阶跳到最后一节台阶和从最后一节跳到第一节是一样的,所以f(n) = f(n-1) + f(n-2),f(1) = 1 ,f(2) = 2
int sum = 0;
if(n
return 0;
else if(n==1)
return 1;
else if(n==2)
return 2;
else
sum = method(n-1) + method(n-2);
return sum;
使用循环:
int a=1;
int b=2;
int sum =0;
if(n
return 0;
else if(n==1)
return 1;
else if(n==2)
return 2;
else
{
for(int i =1;i
sum = a + b;
a = b;
b = sum;
}
}
return sum;