Discuss / Python / 想了半天没想到还是完成这个作业了

想了半天没想到还是完成这个作业了

Topic source
def move(n,a,b,c):
  if n==1:
    print(a,'-->',c)
    return
  move(n-1,a,c,b)
  print(a,'-->',c)
  move(n-1,b,a,c)
  
move(3,'A','B','C')

上一次学的时候,实在想不出来,直接看了答案。过了快2年回来再看,已经不知道怎么写了。这次想着无论如何也要自己写出来。睡前看到递归函数这里的,本来想着练习做完就睡,结果一直想不出来,第二天早上又想了一会终于想出来了,差点耽误正事。下面说下自己的心路历程吧。

首先,既然是递归函数,就要找到它的规律。模拟2,3,4个盘子的移动过程,发现盘子移动的步数为2的n次方-1(后来发现也可以是1*2+...+1*2^(n-1)+1*2^n),所以这个函数极有可能是调用自身两次,才能符合步数为2的n次方,在两次调用前加个print(),试了一下,打印出来的步数正确了,但是步骤是错误的。这时我想思路应该是没错的,可能需要调整语句顺序或参数顺序。

其次,不要总想着数学公式里面发现什么,跳出这个思维,问问自己这个函数干什么用的。前面教程中讲解,告诉你函数是干什么的之后,就没有再深究函数里面的内容,而是按照函数的功能,自我调用。汉诺塔函数的功能就是把所有(n个)盘子从a柱移c柱,在此之前需要先将最底层的一个盘子之外的所有盘子,也就是n-1个盘子从a柱移到b柱,a柱最底下的那个盘子才能移c柱。现在,将n-1个盘子看成另一个所有盘子,调用汉诺塔函数,将所有n-1个盘子从b柱移动到c柱,就完事了。

总的来说,光有这个抽象函数概念是不够的,在有这个概念之前需要模拟出初始的几个具体特例来推导,因此要写出函数,需要有几个引子,这些引子就是从特例推导出的。上面就是将引子抽象化后得来的

抽象特例,就是函数的境界吧。


  • 1

Reply