昨天刚刚以汉诺塔问题为例子接触了递归思想,刚开始是很绕,十分抽象,通过图解来看汉诺塔其实很简单,其本质就是将一个n层塔分为第n层和n-1层两部分,默认初始全部放在最左边,将n-1层移到中间,将第n层移到最右边,最后将n-1层移到最右边。
一开始看别的博主写的代码,由于实参和形参的字母相同,把我给绕进去了,所以在递归过程中奇数个的盘子的参数和偶数个盘子的参数是不同的,比如n=3时,进入到1函数的实参变成了acb,此时n=2,再次进入1函数时实参又变成了abc,当时我便是在这里卡住的不太好理解。 在后来我将形参改成xyz,把x='a',y='b',z='c',这样更容易理解参数的变换。
对于柱的传递我是这样理解的:虽然说都是将n-1的盘子放到中间层,但是盘子数量是奇数和偶数时最上边的两个开始放的位置是不同的,比如当盘子数量为三时,需要将最上边的两个先放到中间(即第一个要放到最右边),当盘子数量为四时,则需要将最上边的两个放到最右边(即第一个要放在中间),这也就解释了代码在递归过程中为什么实参会改变,一开始我的理解时在递归函数里Hanoi(n-1,a,c,b)时实参,递归进去不会发生变化,但其实递归函数里的所有参数都是形参,只有真正调用Hanoi是填进去的才是实参,才能实现参数的变化。
其实对于递归问题的思考,给我带来的感受是不仅让我一定程度上理解了什么是递归,而且透过这个问题让我对参数的转换有了更深层次的理解。这对我的帮助是挺大的。
此篇就当作是一个初学者的自我总结,也相当于输出下自己的观点,毕竟被折磨的时候确实挺难受的。写的有些乱,希望能给到一点帮助。(大佬轻喷)