大家好,又见面了,我是你们的朋友全栈君。今天我们来聊聊“递归”和“迭代”的区别。
1. 递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己。一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量。递归的能力在于用有限的语句来定义对象的无限集合。
2. 迭代:利用变量的原值推算出变量的一个新值。如果递归是自己调用自己的话,迭代就是A不停的调用B。
3. 递归中一定有迭代,但是迭代中不一定有递归,大部分可以相互转换。能用迭代的不用递归,递归调用函数浪费空间,并且递归太深容易造成堆栈的溢出。
4. 递归和迭代都是循环的一种。简单地说,递归是重复调用函数自身实现循环。迭代是函数内某段代码实现循环,而迭代与普通循环的区别是:循环代码中参与运算的变量同时是保存结果的变量,当前保存的结果作为下一次循环计算的初始值。
5. 递归循环中,遇到满足终止条件的情况时逐层返回来结束。迭代则使用计数器结束循环。当然很多情况都是多种循环混合采用,这要根据具体需求。
6. 递归的例子,比如给定一个整数数组,采用折半查询返回指定值在数组中的索引。假设数组已排序,为方便描述,假设元素都为正数,数组长度为2的整数倍。折半查询是查询的一种,比遍历所有元素要快很多。
下面是一个递归的例子:
```c
int Find(int *ary, int index, int len, int value) {
if (len == 1) //最后一个元素
{
if (ary[index] == value) return index; //成功查询返回索引
return -1; //失败,返回-1
}
//如果长度大于1,进行折半递归查询
int half = len / 2;
//检查被查值是否大于上半部分最后一个值,如果是则递归查询后半部分
if (value > ary[index + half - 1])
return Find(ary, index + half, half, value);
//否则递归查询上半部分
return Find(ary, index, half, value);
}
```
迭代经典例子就是实数的累加,比如计算1-100所有实数的和。
以下是重构后的代码,同时添加了注释以解释每个部分的作用:
```java
// 初始化变量v为1
int v = 1;
// 循环从2到100(包含100)
for (int i = 2; i <= 100; i++) {
// 将当前循环变量i的值累加到v上
v = v + i;
}
```
重构后,代码的结构更加清晰和易读。通过使用适当的缩进和添加注释,我们可以更好地理解每个部分的功能和作用。