2
回答
怎样深层次理解递归??

比如有名的汉诺塔问题,就用到了递归,虽然会写,但是不能很清楚的了解到底是如何执行的,(就是进层退层……),然后就是,因为默认的堆栈是固定的,如何修改堆栈呢,也就是如果在汉诺塔问题中,输入了1000(当然了,这个不知道要运行何时才能运行完吖,呵呵),我觉得应该会造成堆栈溢出……如何修改堆栈大小,希望指教。。。

<无标签>
举报
恒水
发帖于6年前 2回/2K+阅
共有2个答案 最后回答: 6年前

首先,递归,你可以想想成循环。for循环也可以看作类似递归的东西。但是for循环和递归有个本质区别在于,for循环,是在循环外,进行判断,以决定是否直接退出。而递归,是在循环体内判断,是否退出本次循环。这里就有两个差别了。

1、并不是说for循环不能在循环体内跳出,完全可以,但是希望强调,这个判断是针对循环体独立的,所以我说循环外,而递归的判断是针对每次的具体的循环而不是对整体循环是否停止做判断。

2、for跳出循环体,则前面的循环均不会再重现,而递归是退回到上一次的循环。

上面两者合起来就是我说的比较本质的区别。由此递归,是行为上循环。而每次循环,均属于自己独立的空间。而多次循环是累加,嵌套的。

你可以把递归看做到楼顶取东西。从一楼爬,看,不是的,继续爬,每层楼梯看上去都一样,你执行的过程都一样,但是实际上,1到2,2到3的楼梯是两个楼梯,等你到楼顶了,取了东西,你不能直接就跳楼,还得从楼顶一层层退回来。

而驴子拉磨,则属于for循环。无论跑多少次,都是在原地。变化的只是磨盘里磨的东西,而不是驴每圈所在的不同位置。

函数调用函数的堆栈是系统分配的,这个空间大小和空间在哪,你简单的玩法是改不了,要动堆栈寄存器。现在的电脑,1000不会溢出。呵呵。

堆栈你只能修改两个指针,基指(基地址指针,不是错别字)和变指,基指对于堆栈自身逻辑,唯一的作用就是判断堆栈是否空,而变指是完成先进后出的保证。所以谈堆栈就不存在大小的问题。除非你打算每次堆栈都进行判断修正操作。当然你可以截取MMU的错误中断响应,动态调整堆栈的大小,可以实现,不过没什么必要,工程中如果出现堆栈问题,会尽可能的将该问题移动到判断系统工作负载容量上,确保堆栈现有空间在系统可承受的需求响应下不会溢出,而不是每次堆栈操作判断是否出错,无论你判断还是MMU。

--- 共有 3 条评论 ---
似笑似哭收获颇多,谢谢了 5年前 回复
learnning有道理,收益很多啊,谢谢 6年前 回复
恒水恩,谢谢。 6年前 回复
顶部