1:斐波那数列就是该项等于前面两项之和,如果第一项和第二项则等于1,,就如下面数列:
1 1 2 3 5 8 13 21.。。。。。。。,不要想是不是按照0,1,2,3,4,5这样顺序加,而是看前两项是多少,一步步推测。要输入n,求第n 项斐波那契数列;
Java版实现:如果采用递归思想,比如求第五项,则递归下去,重复项太多,所以效率很差。
- public long Fibonacci(int n){
- if(n<=1)
- return n;
- return Fibonacci(n-1)+Fibonacci(n-2);
- }
改进方法:从下往上算,首先根据f(1)和f(2)计算出f(3),再根据f(2)和f(3)计算出f(4)…..一次类推计算出第n项。容易理解这种思路的时间复杂度是O(n)
public static void main(String[] args){
Scanner t = new Scanner(System.in);
int f =t.nextInt();
System.out.println(hanshu(f));
}
public static int hanshu(int n){
if(n<=1)
return n;
int one = 0;
int two = 1;
int sum =0;
for(int i =2; i<=n;i++){
sum = one+two;
one= two;
two=sum;
}
return sum;
}}
题目二:
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
解题思路:
先跳到n-1级,再一步跳到n级,有f(n-1)种;
先跳到n-2级,再一步跳到n级,有f(n-2)种;
先跳到n-3级,再一步跳到n级,有f(n-3)种;
。。。。。。
先跳到第1级,再一步跳到n级,有f(1)种;
所以:
f(n)=f(n-1)+f(n-2)+f(n-3)+···+f(1)
f(n-1)=f(n-2)+f(n-3)+···+f(1)
推出f(n)=2*f(n-1)
代码实现:
package javafirst;
import java.util.Scanner;
public class JumpFloor{
public static void main(String[] args){
Scanner t = new Scanner(System.in);
int f = t.nextInt();
System.out.println(jumpFloor(f));
}
public static int jumpFloor(int num)
{ if(num<=2)
return num;
int jumptwo = 2;
int sum = 0;
for(int i = 3;i<=num;i++){
sum = 2*jumptwo;
jumptwo =sum;
}
return sum;
}
}