斐波那契数列的经典算法题自我学习
基本斐波那契是数列递归和非递归思路
//斐波那契数
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
Scanner sb = new Scanner(System.in);
int n = sb.nextInt();
Demo demo = new Demo();
System.out.println(demo.Find1(n));
}
//递归实现
public int Find(int n){
if(n<=0) return 0;
if(n==1) return 1;
return Find(n-1)+Find(n-2); //时间复杂对高
}
//非递归
public int Find1(int n){
int[] res = {0,1};
if(n<2) return res[n];
int one = 1;
int two = 0;
int num=0;
for(int i=2;i<=n;i++){ //缓存,可以简化递归,时间复杂对低
num = one+two;
two = one;
one = num;
}
return num;
}
}
经典笔试题(青蛙跳台阶)
这里需要利用缓存机制,节省时间,如果笔试写了递归,很有可能你会被pass掉;
//青蛙跳台阶,本质上是斐波那契数列。
import java.util.Scanner;
/**
*我们把n级台阶时得跳法看成n的函数,记为F(n),当n>2时,第一次跳的时候就有两种结果,因此n
* 级台阶的不同跳法的总数为f(n)=f(n-1)+f(n-2);
*
*/
public class Demo {
public static void main(String[] args) {
System.out.print("输入要跳的台阶数:");
Scanner sc= new Scanner(System.in);
int n = sc.nextInt();
Demo sb = new Demo();
System.out.println(sb.Find(n));
}
public int Find(int n){
int[] res = {0,1};
if(n<2) return res[n];
int one = 1;
int two = 0;
int num = 0;
for (int i=2;i<=n;i++){
num = one+two;
two = one;
one = num;
}
return num;
}
}
方格覆盖问题
import java.util.Scanner;
public class Deom {
public static void main(String[] args) {
System.out.print("输入2*n个格子:");
Scanner sc = new Scanner(System.in);
int number = sc.nextInt();
Deom sb = new Deom();
System.out.println(sb.Find(number));
}
public int Find(int number){
int[] res = {0,1};
if(number<2) return res[number];
int one = 1;
int two = 0;
int num = 0;
for (int i=2;i<=number;i++){
num = one+two;
two = one;
one = num;
}
return num;
}
}
扩展
如果把青蛙跳台阶的条件改为:一只青蛙一次可以跳上1个台阶,也可以跳上2级…它也可以跳上n级,此时该青蛙跳上一个n级台阶总共有多少种跳法;
我们不难发现,如果是8个台阶 也就是1(2+3+4+5+6+7+8)+2(+3+4+5+6+7+8)…及就是F(n) =2 的n-1次方
/*
* 如果把青蛙跳台阶的条件改为:一只青蛙一次可以跳上1个台阶,也可以跳上2级........它也可以跳上n级,此时该青蛙跳上一个
* n级台阶总共有多少种跳法;我们不难发现,如果是8个台阶
* 也就是1(2+3+4+5+6+7+8)+2(+3+4+5+6+7+8).........及就是F(n) =2 的n-1次方*/
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
Scanner SC = new Scanner(System.in);
int n = SC.nextInt();
Demo sb = new Demo();
System.out.println(sb.BlFind(n));
}
public int BlFind(int n){
if(n==0) return 0;
if(n==1) return 1;
if(n==2) return 2;
int num =2;
while(n-1>=2){
num=num*2;
n--;
}
return num;
}
}