递归和循环的区别

递归算法

优点

代码简洁、清晰,并且容易验证正确性。(如果你真的理解了算法的话,否则你更晕)

缺点

它的运行需要较多次数的函数调用,如果调用层数比较深,需要增加额外的堆栈处理,比如参数传递需要压栈等操作,会对执行效率有一定影响。但是,对于某些问题,如果不使用递归,那将是极端难看的代码。

递归的三要素

明确递归终止条件

我们知道,递归就是有去有回,既然这样,那么必然应该有一个明确的临界点,程序一旦到达了这个临界点,就不用继续往下递去而是开始实实在在的归来。换句话说,该临界点就是一种简单情境,可以防止无限递归。

给出递归终止时的处理办法

我们刚刚说到,在递归的临界点存在一种简单情境,在这种简单情境下,我们应该直接给出问题的解决方案。一般地,在这种情境下,问题的解决方案是直观的、容易的。

提取重复的逻辑,缩小问题规模

我们在阐述递归思想内涵时谈到,递归问题必须可以分解为若干个规模较小、与原问题形式相同的子问题,这些子问题可以用相同的解题思路来解决。从程序实现的角度而言,我们需要抽象出一个干净利落的重复的逻辑,以便使用相同的方式解决子问题。

斐波那契数列

public class Solution {
    public int Fibonacci(int n) {
        if(n == 0) {
        	return 0;
        }
        if(n == 1) {
        	return 1;
        }
        return Fibonacci(n-2) + Fibonacci(n-1);
    }
}

循环算法

优点

速度快,结构简单

缺点

并不能解决所有的问题。有的问题适合使用递归而不是循环。如果使用循环并不困难的话,最好使用循环。

总结

  1. 一般递归调用可以处理的算法,也通过循环去解决常需要额外的低效处理 。
  2. 现在的编译器在优化后,对于多次调用的函数处理会有非常好的效率优化,效率未必低于循环。

欢迎关注微信号【Java小灶台】,一起学习

在这里插入图片描述

posted @ 2022-04-01 18:08  鸟不拉诗  阅读(120)  评论(0编辑  收藏  举报