递归与循环(Fibonacci)
问题总览:分别使用循环或递归解决问题,感受两者不同
//求1+2+3+...+n的和
System.out.println(addFrom1ToN(100));
System.out.println(addFrom1ToN2(100));
//当递归调用的层级太多时,就会超出栈的容量 ,从而导致调用栈溢出栈溢出
// Exception in thread "main" java.lang.StackOverflowError
//求斐波那契数列的第 n 项。 n=0,f(n)=0; n=1,f(n)=1; n>1,f(n)=f(n-1)+f(n-2)
System.out.println(Fibonacci(10));
System.out.println(Fibonacci2(10));
//青蛙跳台阶
System.out.println(jumpSteps(10));
System.out.println(jumpSteps_digui(10));
求1+2+3…+n的和
/**
* 递归,时间空间消耗大,效率不如循环
* @param n
* @return
*/
public static int addFrom1ToN2(int n){
//递归出口,当n=1时函数就会逐层返回
if(n==1){
return 1;
}
return n+addFrom1ToN2(n-1);
}
/**
* 循环,计算1+2+...+N的值
* @param N
* @return 计算结果
*/
public static int addFrom1ToN(int N){
int result = 0;
for (int i = 1; i <=N ; i++) {
result += i;
}
return result;
}
求斐波那契数列第N项值
/**递归解法,求斐波那契数列的第 n 项。
* 斐波那契函数 n>1,f(n)=f(n-1)+f(n-2)
* @param n
* @return
*/
public static int Fibonacci(int n){
int[] res = {0,1};
if(n<2){
return res[n];
}
return Fibonacci(n-1)+Fibonacci(n-2);
}
/**非递归解法,求斐波那契数列的第 n 项。 时间复杂度是 O(n)
* 斐波那契函数 n>1,f(n)=f(n-1)+f(n-2)
* @param n
* @return
*/
public static int Fibonacci2(int n) {
int[] res = {0, 1};
if (n < 2) {
return res[n];
}
int fibN = 0;//存储第n项的值
int fibNMinusOne = 1;//f(1)
int fibNMinusTow = 0;//f(0)
for (int i = 2; i <=n ; i++) {
fibN = fibNMinusOne + fibNMinusTow;
fibNMinusTow = fibNMinusOne;
fibNMinusOne = fibN;
}
return fibN;
}
求青蛙跳n级台阶共有几种跳法(一次只能跳一或两个台阶)
/**非递归实现
* 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
* @param n
* @return
*/
public static int jumpSteps(int n){
int[] res = {1,1,2};
if(n<3){
return res[n];
}
int sum = 0;//跳n个台阶有几种跳法
int fibNMinusOne = 2;//f(2)
int fibNMinusTow = 1;//f(1)
for (int i = 3; i <=n ; i++) {
sum = fibNMinusOne + fibNMinusTow;
fibNMinusTow = fibNMinusOne;
fibNMinusOne = sum;
}
return sum;
}
public static int jumpSteps_digui(int n){
if(n<3){
int[] res = {1,1,2};
return res[n];
}
return jumpSteps_digui(n-1)+jumpSteps_digui(n-2);
}