哈哈,没有参考网上的算法,自己从 n = 4 一步步画图推导出来了,说下我自己的理解。
代码:
def move(n, a, b, c): if n == 1: print('%s --> %s' % (a, c)) else: move(n-1, a, c, b) print('%s --> %s' % (a, c)) move(n-1, b, a, c)
思路:
由于规则是小能压大而大不能压小,所以不论中间步骤如何,最后每个盘子落到C肯定是从大到小的顺序。所以肯定是第n个先落到C,而由于第n个是最大的,所以有且只有一种方法把第n个落到C:先把上面n-1个全部移到B,然后才能把第n个落到C。
由此把整个过程拆分为三步:
用函数表示就是: move(n, a, b, c) = move(n-1, a, c, b) + move(1, a, b, c) + move(n-1, b, a, c)
move(n, a, b, c) = move(n-1, a, c, b) + move(1, a, b, c) + move(n-1, b, a, c)
注意 a、b、c 的顺序。
这三步实质上是进行了两次递归和1次实际移动。这样递归下去,形成了一个树状递归结构,所以最终步数是: 1 + 2 + 4 + 8 + ... + 2**(n-1) = 2**n -1
1 + 2 + 4 + 8 + ... + 2**(n-1) = 2**n -1
思路差不多理解了,可是为啥打印出来的东西不理解是什么意思?求大神帮解答。
理解了,谢谢撸主。
Sign in to make a reply
大梦shake
哈哈,没有参考网上的算法,自己从 n = 4 一步步画图推导出来了,说下我自己的理解。
代码:
思路:
由于规则是小能压大而大不能压小,所以不论中间步骤如何,最后每个盘子落到C肯定是从大到小的顺序。所以肯定是第n个先落到C,而由于第n个是最大的,所以有且只有一种方法把第n个落到C:先把上面n-1个全部移到B,然后才能把第n个落到C。
由此把整个过程拆分为三步:
用函数表示就是:
move(n, a, b, c) = move(n-1, a, c, b) + move(1, a, b, c) + move(n-1, b, a, c)
注意 a、b、c 的顺序。
这三步实质上是进行了两次递归和1次实际移动。这样递归下去,形成了一个树状递归结构,所以最终步数是:
1 + 2 + 4 + 8 + ... + 2**(n-1) = 2**n -1