python 迭代和展开为什么有不同?

同样的一个函数,其他部分完全相同,为什么出现完全不同的结果?
图片说明
图片说明

第一张图结果是successfully 第二张图报错,为什么?
输出结果的意义可以忽略,问题就出在cons函数部分

第二种方法,lambda会在循环结束后所有的参数都是循环最后一个数据。

作者:叶飞影
链接:https://www.zhihu.com/question/20278387/answer/123876191
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

迭代是将输出做为输入,再次进行处理。比如将摄像头对着显示器;比如镜子对着镜子;比如KTV中将麦克对着音箱;比如机关枪扣动扳机发射子弹后,利用后座力继续扣动扳机。用程序表述就是:for (int i=0; i < 100; i++) n = f(n);比如下面这段生成分形图像的代码:Shadertoy BETAvec2 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;

}
<img src="https://pic4.zhimg.com/50/c216757c10f25585b58071b6fc2b5b07_hd.jpg" data-rawwidth="800" data-rawheight="450" class="origin_image zh-lightbox-thumb" width="800" data-original="https://pic4.zhimg.com/c216757c10f25585b58071b6fc2b5b07_r.jpg"&gt;程序中迭代了100遍,迭代次数越多,生成的图像细节度越高。再给迭代举个通俗点的例子:假如你有一条哈士奇和一条中华田园犬,怎么让它们串出比较纯正的哈士奇呢?先让哈士奇与中华田园犬配对,生下小狗。再让哈士奇与小狗配对,当然要等小狗长大后。就这样一直让哈士奇与新生的小狗配对,一代一代地迭,最终你能得到比较纯正的哈士奇。如果你纠结猫三狗四,猪五羊六,牛七马八这样的自然规律,不妨把两条狗改为老鼠与宠物仓鼠,他们一个月就能迭代一次。递归,简讲就是自己调用自己,自己包含自己。用程序表述就是:void f(int n){f(n - 1);}不要在意这是死循环代码,只需知道这个函数中,又调用了函数自身,属于自己调用自己。比如,显示器中的显示器,镜子中的镜子。我前面写着:摄像头对着显示器,镜子对着镜子是迭代,怎么现在又改成递归了?这不矛盾,因为摄像头对着显示器,镜子对着镜子这种行为是输出做为输入,再次进行处理,所以是迭代。显示器中的显示器,镜子中的镜子这种效果是自己包含自己,所以是递归。如同上面那幅图像,生成它的代码是迭代,而分形的效果是递归。