欢迎阅读子豪博客()
有什么宝贵的意见或建议可以在留言区留言
欢迎
码云仓库:补王子 (YZH_skr) - Gitee.com
生活中的递归
递归应满足以下条件
1.在方法内部,在执行过程中调用自己,每次执行到一部分时执行另一部分
2.递归出口应具有接近终止的条件(归的起始条件)
递归 = 递 归
代码示例: 递归求 N 的阶乘
代码示例求斐波那契数列第 N 项
当我们求 fib(40) 当时发现, 程序执行速度非常慢. 原因是进行了大量的重复操作
斐波那契数列问题可以循环, 避免冗余操作.
生活中的递归
过去,山上有座庙,庙里有个老和尚给小和尚讲故事: "以前有座山,山上有座庙,庙里有个老和尚给小和尚讲故事,讲的是: "从前有座山,山上有座庙..." "从前有座山……"
递归应满足以下条件
1.在方法内部,在执行过程中调用自己,每次执行到一部分时执行另一部分
2.递归出口应具有接近终止的条件(归的起始条件)
递归相当于数学 "数学归纳法", 有起始条件, 然后是递推公式
递归 = 递 归
代码示例: 递归求 N 的阶乘
public static oid main(String[] args) {
int n = 5;
int ret = factor(n);
System.out.println("ret = " + ret);
}
public static int factor(int n) {
if (n == 1) {
return 1;
}
return n * factor(n - 1); // factor 调用函数自身
}
// 执行结果
ret = 120
代码示例 求斐波那契数列的第 N 项
public static int fib(int n) {
if (n == 1 || n == 2) {
return 1;
}
return fib(n - 1) + fib(n - 2);
}
当我们求 fib(40) 的时候发现, 程序执行速度极慢. 原因是进行了大量的重复运算
class Test {
public static int count = 0;
public static void main(String[] args) {
System.out.println(fib(40));
System.out.println(count);
}
public static int fib(int n) {
if (n == 1 || n == 2) {
return 1;
}
if (n == 3) {
count++;
}
return fib(n - 1) + fib(n - 2);
}
}
// 执行结果
102334155
39088169 // fib(3) 重复执行了 3 千万次
可以使用循环的方式来求斐波那契数列问题, 避免出现冗余运算.
class Test {
public static int count = 0;
public static void main(String[] args) {
System.out.println(fib(40));
System.out.println(count);
}
public static int fib(int n) {
int last2 = 1;
int last1 = 1;
int cur = 0;
for (int i = 3; i <= n; i++) {
cur = last1 + last2;
last2 = last1;
last1 = cur;
}
return cur;
}
}