「递归」和「迭代」有哪些区别?

关注者
908
被浏览
630,750

65 个回答

电影故事例证:

迭代——《明日边缘》

递归——《盗梦空间》

迭代是将输出做为输入,再次进行处理。比如将摄像头对着显示器;比如镜子对着镜子;比如KTV中将麦克对着音箱;比如机关枪扣动扳机发射子弹后,利用后座力继续扣动扳机。

用程序表述就是:for (int i=0; i < 100; i++) n = f(n);

比如下面这段生成分形图像的代码:

Shadertoy BETA
vec2 center = vec2(0.8,0);
float blue = 0.3; 

void mainImage( out vec4 fragColor, in vec2 fragCoord ) {
    vec2 z, c;
	float scale = 20.0/iGlobalTime; // zoom in
	vec2 uv = fragCoord.xy / iResolution.xy;

    c.x = 1.3333 * (uv.x - 0.5) * scale - center.x;
    c.y = (uv.y - 0.5) * scale - center.y;
    z = c;
	vec4 col = vec4(0,0,0,0);
	
    for(int i=0; i<100; i++) {
        float x = (z.x * z.x - z.y * z.y) + c.x;
        float y = (z.y * z.x + z.x * z.y) + c.y;		
		blue += 0.028; 
		if((x * x + y * y) > 4.0) {
			col = vec4(0,0,blue,0);
			break;
		}
        z.x = x;
        z.y = y;
    }
	fragColor = col;
}

程序中迭代了100遍,迭代次数越多,生成的图像细节度越高。

再给迭代举个通俗点的例子:假如你有一条哈士奇和一条中华田园犬,怎么让它们串出比较纯正的哈士奇呢?先让哈士奇与中华田园犬配对,生下小狗。再让哈士奇与小狗配对,当然要等小狗长大后。就这样一直让哈士奇与新生的小狗配对,一代一代地迭,最终你能得到比较纯正的哈士奇。如果你纠结猫三狗四,猪五羊六,牛七马八这样的自然规律,不妨把两条狗改为老鼠与宠物仓鼠,他们一个月就能迭代一次。

递归,简讲就是自己调用自己,自己包含自己。

用程序表述就是:void f(int n){f(n - 1);}不要在意这是死循环代码,只需知道这个函数中,又调用了函数自身,属于自己调用自己。

比如,显示器中的显示器,镜子中的镜子。我前面写着:摄像头对着显示器,镜子对着镜子是迭代,怎么现在又改成递归了?这不矛盾,因为摄像头对着显示器,镜子对着镜子这种行为是输出做为输入,再次进行处理,所以是迭代。显示器中的显示器,镜子中的镜子这种效果是自己包含自己,所以是递归。如同上面那幅图像,生成它的代码是迭代,而分形的效果是递归。