def move(n, a='A', b='B', c='C'):
if n == 1:
return print(a, "->", c)
else:
move((n-1), a, c, b)
print(a, "->", c)
move((n-1), b, a, c)
move(3)
第6行print(a, "->", c)
可以写做move(1, a, b, c)
都是一样的效果。
开始运行move( 3 )
:
move 函数代入 ‘ 行9’ ( n = 3 )参数 (3, a='A', b='B', c='C')
第一步 执行 ‘行2 - 3’ if n == 1:......
:
n != 1
, ‘行2 - 3’ 越过
第二步 执行 ‘行4’else:
:
- 执行 ‘行5’, 第一次递归开始,
((n-1), a, c, b)
回到函数最初代入(3, a='A', b='B', c='C')
,得出参数为(2, 'A', 'C', 'B')
,【!注意: 此时‘行1 ’(3, a='A', b='B', c='C')
在 ‘行5’ 递归回到函数最初运行后已改变为(2, a='A', b='C', c='B')
】 - 执行 ‘行2 - 3’ ,
n != 1
, ‘行2 - 3’ 越过 - 执行
else:
- 执行 ‘行5’,将
((n-1), a, c, b)
代入(2, a='A', b='C', c='B')
,得出参数为(1, 'A', 'B', 'C')
,继续执行 ‘行2 - 3’,n == 1
返回输出:(a, "->", c)
代入(1, 'A', 'B', 'C')
,即A -> C
- 回到 ’ 行5‘,继续执行 ‘行6’ ,将
(a, "->", c)
代入move函数(2, a='A', b='C', c='B')
并输出,即A -> B
- 执行 ’行7‘,将
( (n-1), b, a, c)
代入(2, a='A', b='C', c='B')
得出参数为(1, 'C', 'A', 'B')
,继续执行 ‘行2 - 3’,n == 1
返回输出:(a, "->", c)
代入(1, 'C', 'A', 'B')
,即C -> B
- 执行 ‘行5’,将
第三步 执行 ‘行6’ print(a, "->", c)
:
(a, "->", c)
代入move函数(3, a='A', b='B', c='C')
并输出,即*A -> C
第四步 执行 ’行7‘ move((n-1), b, a, c)
:
- 执行 ‘ 行7’ ,第二次递归开始,
((n-1), b, a, c)
代入(3, a='A', b='B', c='C')
得出参数为(2, 'B', 'A', 'C')
【!注意: 此时 ‘行1 ’(3, a='A', b='B', c='C')
在 ‘行7’ 递归回到函数最初运行后已改变为(2, a='B', b='A', c='C')
】 - 执行 ‘行2 - 3’ ,
n != 1
, ‘行2 - 3’ 越过 - 执行
else:
- 执行 ‘行5’,将
((n-1), a, c, b)
代入(2, a='B', b='A', c='C')
得出参数为(1, 'B', 'C', 'A')
,继续执行‘行2 - 3’,n == 1
返回输出:(a, "->", c)
代入(1, 'B', 'C', 'A')
,即B -> A
- 回到 ’ 行5‘,继续执行 ‘行6’ ,将
(a, "->", c)
代入move函数(2, a='B', b='A', c='C')
并输出,即B -> C
- 执行 ’行7‘,将
((n-1), b, a, c)
代入(2, a='B', b='A', c='C')
得出参数为(1, 'A', 'B', 'C')
,继续执行 ‘行2 - 3’,n == 1
返回输出:(a, "->", c)
代入(1, 'A', 'B', 'C')
,即A -> C
- 执行 ‘行5’,将
代码运行结束,输出结果为:
A -> C
A -> B
C -> B
A -> C
B -> A
B -> C
A -> C
Comments | NOTHING