迭代和递归思想的总结

首先说一句,递归(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;
}

猜你喜欢

转载自blog.csdn.net/Ryan_lee9410/article/details/80885950