初学编程,汉诺塔的数学问题倒是很好看懂,就是在编程上卡了好久
def move(n,a,b,c)
if (n=1):
print(a,'----------->',c)
else:
move(n-1,a,c,b)
move(1,a,b,c)
move(n-1,b,a,c)
move(n,a,b,c)
print.....
在递归函数的调用上,我卡在这里,搞不清楚的是,为什么move(n-1,a,c,b) 就让所有的盘子,到了b,且print a---->c就把过程全部打出来了? 为什么?会打出所有步骤,
因为上面的move(n,a,b,c)调用了下面三个函数可以实现盘子达到目标,同样,当move(n-1,a,c,b)被递归调用时,会再次调用下面三个函数,这样循环往复,直到,move(1,a,b,c)。这样就实现了所有的盘子到b。
这个抽象的调用和思考过程就是,每一个move不断循环调用下面的三个move函数步骤,直到n=1,print a--->c,这样反过来开始推,就推出了所有步骤。跳会if n=1, print a--->c。的所有构成。
注意函数在打印递归的时候是按照当只剩一个盘子的时候,开始反向推的步骤,
是按照move的三个顺序打印的。
也就是n=1,的时候直接打印a--c
n=2的时候,打印下面的第一个move(a--b)然后move a--b
n=3的时候,反退,move(3,a,b,c)调用move(2,a,c,b)....等下面那三个函数实现目标,但是move(2,a,c,b)有返回来调用(move1,a,b,c)下面的那三个函数,形成递归。
这是数学意义上的递归。
也就是当对象实现数学意义上的递归的时候,我们在编程上就可以循环调用递归函数,实现自己的编程目标。是关于抽象思维,数学思维的一种总结。