在python中使用Counter for Fibonacci

时间:2013-09-27 17:25:01

标签: python recursion counter fibonacci

我编写了一个基本上通过从它创建的字典中读取Fibonacci的程序(给定{0:0,1:1}开始)。显然,如果它没有在字典中,它会创建,直到它,然后稍后调用,所以它不必一遍又一遍地执行相同的序列。我遇到的困难是使用Counter对象来跟踪算法所做的指令(因此我可以在之后绘制初始n增加的调用次数的图表)。从来没有使用类计数器或记忆,所以我最后有点迷失了。

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

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

1 个答案:

答案 0 :(得分: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()

希望这有帮助。