我编写了一个基本上通过从它创建的字典中读取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()
这就是我所拥有的,但老实说,我不知道从哪里开始,非常感谢任何帮助!
答案 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()
希望这有帮助。