【问题标题】:Counting Recursive Calls - Towers of Hanoi计算递归调用 - 河内塔
【发布时间】:2013-10-11 08:55:54
【问题描述】:

我正在处理一个处理河内塔问题的变体的问题,您只能移动到相邻的钉子,而我们仅限于 3 个钉子问题。我已经获得了打印出光盘数量所需移动的代码,但我不知道如何打印递归调用的数量。

def adjacent_hanoi(num_discs, start_peg, end_peg):
"""
Given the number of discs in Adjacent-Peg Tower of Hanoi:
1. Prints each move necessary to solve the puzzle (minimum number of moves)
2. Returns the total number of moves required

For this problem, discs should always start on the first peg and
end on the last peg.

num_discs: an integer number of discs
start_peg: starting peg
end_peg: ending peg
returns: an integer number of moves
"""

if num_discs > 0:
    adjacent_hanoi(num_discs-1, start_peg, end_peg)
    print "Move disc", num_discs, "from peg", start_peg, "to peg", 2
    adjacent_hanoi(num_discs-1, end_peg, start_peg)
    print "Move disc", num_discs, "from peg", 2 , "to peg", end_peg
    adjacent_hanoi(num_discs-1, start_peg, end_peg)

【问题讨论】:

    标签: python recursion towers-of-hanoi


    【解决方案1】:

    使用装饰器!

    class Counter(object):
        def __init__(self, func):
            self.func = func
            self.count = 0
        def __call__(self, *args):
            self.count += 1
            return self.func(*args)
    @Counter
    def your_function():
        return "Hello"
    
    for i in range(10):
         print your_function()
    
    print your_function.count #=> 10
    

    【讨论】:

      【解决方案2】:

      您可以添加一个新参数,我们称之为count

      def adjacent_hanoi(num_discs, start_peg, end_peg, count):
      

      您可以在每次递归调用时递增它。

      另一种方法是添加一个全局变量并增加它。如果没什么特别的,我会这样做。

      【讨论】:

        【解决方案3】:

        我建议在您的函数中添加一个附加参数作为增量计数器:

        def adjacent_hanoi(num_discs, start_peg, end_peg, count=0):
            #do something with num_discs, start_peg, and end_peg
            count += 1
            print count
            return adjacent_hanoi(num_discs, start_peg, end_peg, count)
        

        【讨论】:

          【解决方案4】:

          添加一个作为全局变量的计数器。在函数开始时将其增加 1。

          recursionCounter = 0
          
          def functionToTrack:
              recursionCounter += 1
              #the rest of your code...
          

          如果您只想跟踪递归级别,请将其存储并在每次从函数外部调用时将 recursionCounter 重置为 0。

          functionToTrack()
          firstCallRecursion = recursionCounter
          recursionCounter = 0
          functionToTrack()
          secondCallRecursion = recursionCounter
          recursionCounter = 0
          

          【讨论】:

            【解决方案5】:

            这是一个数学序列。

            只做一个辅助方法

            hanoi_recurse(num_discs, start, end)
            

            与第一种方法做同样的事情

            现在你的代码看起来像

            def adjacent_hanoi(num_discs, start_peg, end_peg):
                adjacent_hanoi_recurse(num_discs, start_peg, end_peg)
                print (3 ** num_discs) - 1
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-09-11
              • 1970-01-01
              • 2013-08-28
              • 2011-10-20
              • 2013-11-11
              • 2013-09-28
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多