1

我编写了一个程序,该程序基本上通过从它创建的字典中读取来执行斐波那契(给定 {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()

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

4

1 回答 1

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()

希望这会有所帮助。

于 2013-09-27T17:40:34.173 回答