循环(loop)
在满足条件的情况下,重复执行同一段代码
类比
很多人玩游戏,也是在一直重复,如:玩王者荣耀一直练一个英雄,同一个出装套路
普通人的一天,差不多都是在重复前一天的内容,也就是循环:
- 吃饭
- 工作/学习
- 娱乐
- 睡觉
迭代(iterate)
按照某种顺序访问 线性结构 中的每一项
线性结构:一般指集合,列表,数组等。
遍历(traversal)
按照某种规则访问 非线性结构 中的每一项
强调 非线性结构,如:树、图
递归(recursion)
递归:指重复调用函数自身
如:在函数 test 内,又调用 test 自己
void test(){
System.out.println(1);
// 方法递归,自己调用自己
test();
}
递归的分类
递归分为两种:
- 直接递归:称为方法自身调用自己。
- 间接递归:方法之间调用,如:A方法调用B方法,B方法调用C方法,C方法调用A方法。
递归求和
int add( int i){
/*
num为1时,方法返回1,
相当于是方法的出口,num总有是1的情况
*/
if( i == 1){
return 1;
}
/*
num不为1时,方法返回 num +(num-1)的累和
递归调用getSum方法
*/
return i + add(i-1);
}
限制
递归有限制,受开发语言中,工作栈大小的限制,如:Java最多能执行1万多次
注意事项
- 递归一定要有 条件限制,保证递归能够 停止下来,否则会发生栈内存溢出。
- 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
应用场景
一个大型复杂的问题,层层转化为一个 与原问题相似,但规模较小 的问题 来求解
关键:小问题须与原始问题为同样的操作,且更为简单。如:斐波那契数列等
如:四层及以上的嵌套循环,代码就变得非常难看,可读性很差,此时应该用递归
与循环比较
循环的优点
运行效率高(不需要函数参数入栈和出栈);
对存储空间占用比递归少,不需要系统维护工作栈;
便于调试。
循环的缺点
三层嵌套循环 的代码还能接受,四层及以上的嵌套循环,代码就变得非常难看,可读性很差。
而且有的问题非常适合用递归,用循环实现会非常困难。
递归的优点
多层嵌套时,代码清晰简洁,易于理解,可读性强。
递归的缺点
运行效率低(函数调用需要参数入 栈和出栈);
对存储空间的占用比循环多,因此受到问题规模和线程空间大小的限制,如果栈溢出,将导致系统崩溃;
不便于调试。
相同点
大部分的递归、遍历、迭代、都是 循环
区别
- 循环(loop) - 最基础的概念, 所有重复的行为
- 递归(recursion) - 在函数内调用自身, 将复杂情况逐步转化成基本情况
- 迭代(iterate) - 按顺序访问 线性结构 中的每一项
- 遍历(traversal) - 按规则访问 非线性结构 中的每一项
参考:
https://blog.csdn.net/lvxiangan/article/details/78622553
https://www.cnblogs.com/feichengwulai/articles/3642107.html
https://blog.csdn.net/uuuutaossienuuuu/article/details/50732185