形参和实参的问题
move(n-1,a,c,b) #这里c是‘B’,b是“C”吗? move(n-1,b,a,c) #这里b是“A”,a是“B” 吗?
move(n-1,a,c,b) #这里c是‘B’,b是“C”吗? move(n-1,b,a,c) #这里b是“A”,a是“B” 吗?
2018-10-26
这个有点难理解。它只是针对递归参数的位置变换,说参数为4ABC不好理解,假设参数4123。这个move(n-1,a,c,b)中c与b的位置进行了换位变成move(n,a,b,c),原本是(4,1,2,3)变成了(4-1,1,3,2),由于3大于1,继续递归,变成(4-1-1,1,2,3),一直到(4-1-1-1,1,3,2)才符合条件进行if语句,输出1-->2,跳出if判断,回上一层(4-1-1,1,2,3)再继续输出1-->3,(4-1-1,2,1,3),进行递归(4-1-1-1,2,3,1)符合if判断输入2-->1...就这样算的,建议用去IDE去用断点调试一下看看规律。回头我把这个递归层次全部列出来。
#if条件不成立的省略
# { 看做递归开始
# } 看做递归结束
move(4, a, b, c):{ #实际数值(4, A, B, C)
move(3, a, c, b):{ #c,b调换,实际数值(3, A, C, B), 将这四个值带入move(3, a, b, c)递归1
move(2, a, c, b):{ #c,b调换,实际数值(2, A, B, C), 将这四个值带入move(2, a, b, c)递归2
move(1, a, c, b):{ #c,b调换,实际数值(1, A, C, B), 将这四个值带入move(1, a, b, c)递归3
if n == 1: #此时n==1,if条件成立
print(a, '-->',c) #这是第一次打印A-->B
} #最近的一次递归3完成,回到递归2,实际数值(2, A, B, C)
print(a, '-->', c) #这是第二次打印A-->C
move(1, b, a, c):{ #a,b调换,实际数值(1, B, A, C), 将这四个值带入move(1, a, b, c)递归4
if n == 1:
print(a, '-->', c)#这是第三次打印B-->C
} #最近的一次递归4完成,回到递归2,实际数值(2, A, B, C)
} #最近的一次递归2完成,回到递归1,实际数值(3, A, C, B)
print(a, '-->', c) #这是第四次打印A-->B
move(2, b, a, c):{ #a,b调换, 实际数值(2, C, A, B), 将这四个值带入move(2, a, b, c)递归5
move(1, a, c, b):{ #c,b调换, 实际数值(1, C, B, A), 将这四个值带入move(1, a, b, c)递归6
if n == 1:
print(a, '-->', c)#这是第五次打印C-->A
} #最近的一次递归6完成,回到递归5,实际数值(2, C, A, B)
print(a, '-->', c) #这是第六次打印C-->B
move(1, b, a, c):{ #a,b调换, 实际数值(1, A, C, B), 将这四个值带入move(1, a, b, c)递归7
if n == 1:
print(a, '-->', c)#这是第七次打印A-->B
} #最近的一次递归7完成,回到递归5,实际数值(2, C, A, B)
} #最近的一次递归5完成,回到递归1,实际数值(3, A, C, B)
} #最近的一次递归1完成,原参数中的move(n - 1, a, c, b)递归全部完成,实际数值(4, A, B, C)
print(a, '-->', c) #这是第八次打印A-->C,下面跟上面同样的方式去理解,就不写了,太累了。
move(3, b, a, c):{
move(2, a, c, b):{
move(1, a, c, b):{
if n == 1:
print(a, '-->', c) #这是第九次打印
}
print(a, '-->', c)#这是第10次打印
move(1, b, a, c):{
if n == 1:
print(a, '-->', c)#这是第11次打印
}
}
print(a, '-->', c) #这是第12次打印
move(2, b, a, c):{
move(1, a, c, b):{
if n == 1:
print(a, '-->', c) #这是第13次打印
}
print(a, '-->', c)#这是第14次打印
move(1, b, a, c):{
if n == 1:
print(a, '-->', c)#这是第15次打印
}
}
}
}
举报