超过光速c 发表于 2020-7-31 23:06:15

求助:函数递归时,参数的位置变换问题(例题:汉诺塔)

源代码如下:
def move(n, a, b, c):#①
    if n == 1:
      print(a,'1--->', c)
    else:
      move(n-1, a, c, b)#②
      print(a, '2--->', c)
      move(n-1, b, a, c)

move(3, 'A', 'B', 'C')

描述:
当参数传入时,参数的顺序是(n, a, b, c),也就是 ①处
执行到②处函数进行递归时,传入的参数顺序是(n, a, b, c),从②到①会重新对参数位置顺序排序吗?

内部的执行过程:
n = 3 ,a = 'A',b = 'B',c = 'C'

n = 2 ,a = 'A',b = 'C',c = 'B'

n = 1 ,a = 'A',b = 'B',c = 'C'

问题:
从n的值从2变到1的时候,后面b和c的参数变化不是很理解,求助大佬解答一下疑惑。

永恒的蓝色梦想 发表于 2020-7-31 23:12:00

不就是 b 和 c 调换了位置嘛?

ngh888 发表于 2020-7-31 23:15:18

求解加一,三层就把我绕晕了

超过光速c 发表于 2020-7-31 23:27:12

ngh888 发表于 2020-7-31 23:15
求解加一,三层就把我绕晕了

是的,第三层的参数位置变换把我绕晕了。我怎么理都理不清楚。先静一静,一会儿再理一下试试,看能不能自己理清楚。有大佬能来帮忙快速解答就更棒了。

超过光速c 发表于 2020-7-31 23:34:42

永恒的蓝色梦想 发表于 2020-7-31 23:12
不就是 b 和 c 调换了位置嘛?

我知道换了位置,就是这个第三层,怎么换的,有点晕。能解释一下吗?

n=2的时候,进行再次递归。
传入前,参数的顺序应该是(n=2,a='A',c='B',b='C') --- a c b
传入后,参数的顺序应该是(n=2,a='A',b='C',c='B')   --- a b c

n=1
传入前,参数的顺序是(n=1, a='A', c='C', b='B')--- a c b
传入后,参数的顺序是(n=1, a='A', b='B', c='C')--- a b c

是这样理解的吗?

永恒的蓝色梦想 发表于 2020-7-31 23:48:43

超过光速c 发表于 2020-7-31 23:34
我知道换了位置,就是这个第三层,怎么换的,有点晕。能解释一下吗?

n=2的时候,进行再次递归。


什么叫 传入前 和 传入后 ?

ngh888 发表于 2020-8-1 10:11:08

而且我还没看懂为啥会打印七次

超过光速c 发表于 2020-8-1 10:26:57

永恒的蓝色梦想 发表于 2020-7-31 23:48
什么叫 传入前 和 传入后 ?

嗯……你看一下我上传的代码,我在后面备注了①和②的位置,它们的参数位置。

超过光速c 发表于 2020-8-1 10:34:23

ngh888 发表于 2020-8-1 10:11
而且我还没看懂为啥会打印七次

呃呃,7次就是,最简的步骤呀。
把1和2当成整体,全都移到b柱上,然后把3移动到c柱上,再把b柱上的1和2全都移动到c柱上。
次数的公式的话就是: 2**n - 1(2的n次方 减 1 )
页: [1]
查看完整版本: 求助:函数递归时,参数的位置变换问题(例题:汉诺塔)