擅长:python、mysql、java
<p>重复该条件可能比重复计数和打印更短:</p>
<pre><code>conta = 0
def tower(disco, doPino, noPino, tempPino):
global conta
if disco>1: tower(disco - 1, doPino, tempPino, noPino)
conta += 1
print(f'{conta} - Coloque o disco {disco} do pino {doPino} no {noPino}')
if disco>1: tower(disco - 1, tempPino, noPino, doPino)
</code></pre>
<p>通过将打印和计数放在两个递归调用之间,将光盘<code>n</code>从<code>start</code>移动到<code>end</code>之前需要执行的所有操作都将在打印移动之前打印(并计数)。之后需要进行的每一次移动都由第二次递归调用打印出来。当<code>n</code>为1时,顶部没有光盘,因此该函数只打印并计算单个移动</p>
<p>在这种情况下,第一个调用是将光盘5从“A”移动到“C”。但在此之前,盘5顶部的每个盘都需要移动到“B”。因此,我们让第一个递归调用实现这一点。然后我们打印移动(光盘5从“A”到“C”)。这将在位置“B”留下一堆光盘(1,2,3,4),因此第二次递归调用将处理从“B”移动到“C”的光盘1,2,3,4,并在移动光盘5后打印</p>
<p>简言之,要将光盘1、2、3、4、5从“A”移动到“C”,我们有:</p>
<pre><code>tower(5,'A','C','B'):
# perform/print/count all moves to get discs 1,2,3,4 from 'A' to 'B'
# print/count move disc 5 from 'A' to 'C'
# perform/print/count all moves to get discs 1,2,3,4 from 'B' to 'C'
</code></pre>