迭代和递归思想的总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
迭代和递归思想的总结
⾸先说⼀句,递归(recursion)和迭代(iteration)都是实现循环的⼿段。
递归是重复调⽤函数⾃⾝实现循环(函数⾃⼰调⽤⾃⼰)。
迭代是函数内某段代码实现循环。
⽽迭代与普通循环的区别是:循环代码中参与运算的变量同时是保存结果的变量,当前保存的结果作为下⼀次循环计算的初始值。
递归循环中,遇到满⾜终⽌条件的情况时逐层返回来结束。
迭代则使⽤计数器结束循环。
当然很多情况都是多种循环混合采⽤,这要根据具体需求。
【耗时⽐较】
递归时,参数越⼤,耗费的时间越多,⽽迭代可以忽略不计!
结论:在耗时⽅⾯,迭代 < 递归
⼀般来说,⼤部分⼈存在的观点:能不⽤递归就不⽤递归,递归都可以⽤迭代来代替。
但是存在即合理,所以不能说的太绝对。
具体的深⼊⽐较,可以看看这位博主写的⽂章:
【简单代码⽰例】
// 迭代
int 迭代(int n) // n = 6
{
int s = 1;
for (int i = 1; i <= n; i++)
{
s *= i;
//s = s * i
//s = 1 * 1
//s = 1 * 2
//s = 2 * 3
//s = 6 * 4
//s = 24 * 5
//s = 120 * 6
}
//s = 720
return s;
}
//迭代-总结:
//这⾥怎么看出来要迭代什么呢?
//注意s这个变量,它⼀直是以⾃⼰或⾃⼰的"后代",也就是⾃⼰的下⼀代去跟其他数值"进化"。
//int s = 1; 祖先s_Ⅰ代
//s = 1 * 1 祖先s_Ⅰ代-进化
//s = 1 * 2 s_Ⅱ代-进化祖先s_Ⅰ代-死去
//s = 2 * 3 s_Ⅲ代-进化 s_Ⅱ代-死去
//s = 6 * 4 s_Ⅳ代-进化 s_Ⅲ代-死去
//s = 24 * 5 s_Ⅴ代-进化 s_Ⅳ代-死去
//s = 120 * 6 s_Ⅵ代-进化 s_Ⅴ代-死去
//最后只剩下 s_Ⅵ代!
//递归
int 递归(int n) // n = 6
{
//(int n)保存每次进⼊函数时n参数的递减值拷贝
//n = 6 5 4 3 2 1
int s = 1;
//s = 1 1 1 1 1 1
if (n > 1) //6,5,4,3,2⼀共进⼊5次递归
{
{
//n = 6 5 4 3 2 1
//s = 1 1 1 1 1 1
s = 递归(n - 1);
//因为递归后,所有值都是从最后⼀次开始算
//n = 2 3 4 5 6
//为什么n没有1呢?因为if (n > 1) 当 n=1 时并没有进⼊此判断语句.
//s = 1 2 6 24 120
//为什么s中有个1呢,因为最后当 n=1 if (n > 1) 直接返回s = 1.
s *= n;
//按递归后顺序代⼊s,n
//s = s * n 其中n是参数的拷贝
//s = 1 * 2
//s = 2 * 3
//s = 6 * 4
//s = 24 * 5
//s = 120 * 6 ⼀共5次
}
//n = 1 2 3 4 5 6
//s = 1 2 6 24 120 720
return s;
//这⾥要是return n;那么n是⼏呢?答案是6
}
//递归-总结:
//这⾥怎么看出来s没有"迭代"呢?
//很简单,因为此函数局部变量s,即不是静态局部变量,也不是全局变量。
//所以此函数会⽣成6个n和s⼀共12个的变量单独⽤于计算。
//再回头看看"迭代"函数⾥ s,n 都是维⼀的,再加个 i 也是维⼀的,⼀共只有3个变量。
//要点:从递归函数被调⽤的那⼀刻起,后⾯的过程全都是从"最内层"(最后⼀次)开始算。
//递归_迭代:
int 递归_迭代(int n) // n = 6
{
//通过局部静态变量保存每次更改后的值.
static int s = 1;
s *= n;
//s = s * n 其中s是静态变量所以会被保存
//s = 1 * 6
//s = 6 * 5
//s = 30 * 4
//s = 120 * 3
//s = 360 * 2
//s = 720 * 1
if (n > 1)
{
递归_迭代(n - 1);
}
//s = 720
return s;
}
//递归_迭代-总结
【常拿来举例的经典例⼦:斐波那契数列】
(不知道是什么的⼈,请移步某百科:)
fib(0)=0;
fib(1)=1;
fib(n)=fib(n-1)+fib(n-2);
//递归的写法
int fib(int n){
if(n>1) return fib(n-1) + fib(n-2);
else return n; // n = 0, 1时给出recursion终⽌条件}
//迭代的写法
int fib(int n){
int i, temp0, temp1, temp2;
if(n<=1) return n;
temp1 = 0;
temp2 = 1;
for(i = 2; i <= n; i++){
temp0 = temp1 + temp2;
temp2 = temp1;
temp1 = temp0;
}
return temp0;
}
整理不易...。