【问题标题】:Using Counter in python for Fibonacci在 python 中使用 Counter 计算斐波那契
【发布时间】:2013-09-27 17:25:00
【问题描述】:

我编写了一个程序,该程序基本上通过读取它创建的字典来计算斐波那契(给定 {0:0, 1:1} 开始)。显然,如果字典中没有它,它将创建直到它出现,然后再调用,因此它不必一遍又一遍地执行相同的序列。我遇到的困难是使用 Counter 对象来跟踪算法执行的指令(这样我就可以绘制随着初始 n 增加的调用次数的图表)。之前从未使用过类 Counter 或 memoization,所以最后我有点迷失了。

    dic = {0:0, 1:1}

    def main():
        n = int(input("Number to Fibonacci?"))
        fib(n)
        print(dic[n])
        Counter()
        memoization(n, Counter, dic)

    def fib(n):
        if n in dic:
            return dic[n]
        else:
            if n < 2:
                dic[n] = n
            else:
                dic[n] = fib(n-2) + fib(n-1)
                return dic[n]

    class Counter():
        def __init__(self):
            self._number = 0
        def increment(self):
            self._number += 1
        def __str__(self):
            return str(self._number)
        def print():
            print(str(self._number))

    def memoization(n, Counter, dic):
        if n in dic:
            return dic[n]
        else:
            c.increment()

     main()

这就是我所拥有的,但老实说,我不知道从哪里开始,非常感谢任何帮助!

【问题讨论】:

  • 我真的不明白你从哪里得到这个Counter 课程或者你为什么要这样做。现在它只代表一个你正在递增的整数。大部分代码都被破坏了。您可能会考虑阅读更多关于如何在 Python 中进行记忆化的内容,而不是沉迷于使用这个无用的 Counter 类做任何事情。如果您搜索 SO,已经有很多关于如何在 Python 中编写斐波那契的答案,包括记忆版本。虽然这对我来说听起来像是家庭作业,所以我真的不知道该告诉你什么......

标签: python recursion counter fibonacci


【解决方案1】:

据我所知,您的Counter 只需要正确声明即可。这可确保您将 Counter 类的相同实例传递给该方法。

def main():
    ...
    my_counter_name = Counter() # <-- NAME THIS
    memoization(n, my_counter_name, dic) # <-- pass the same name

然后改变这个:

def memoization(n, Counter, dic): # <-- No need to write the class in Python
                                  #     just the local name for the variable
        if n in dic:
            return dic[n]
        else:
            c.increment()

如果您想使用 c 作为计数器的名称,正如您在 memoization 方法的第 4 行中指出的那样,您应该将输入变量更改为:

def memoization(n, c, dic):
        if n in dic:
            return dic[n]
        else:
            c.increment()

希望对您有所帮助。

【讨论】:

  • 这修复了基本代码,但Counter 实例在记忆实现中仍然没有任何作用。我什至不确定你会用它来实现fib
  • 在我认为他们的最终目标的实现中,我可以看到更多的缺陷。提问者提到使用Counter 来跟踪调用“memoization”方法。我想知道我指出的事情至少可以让提问者有更简单的更正语法问题来调试代码的算法问题。
  • 我明白你在说什么,这是有道理的。希望它至少能让他们走上正轨。
猜你喜欢
  • 2016-12-11
  • 2013-03-31
  • 2016-08-04
  • 2012-12-03
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
  • 2016-09-01
相关资源
最近更新 更多