斐波那契求和与记忆[重复]

问题描述 投票:0回答:1

我正在学习一门编程课程,有一个关于fibonacci sums和递归的问题.规则如下。

写一个函数fibsum(N) 返回所有小于N的偶数斐波那契项的和。

我想我已经很接近了,但是我的求和并没有正常工作,另外我还希望函数能工作得很高(比如N=10**6至少),这是我目前的代码。

def fibsum(n, memo = {}):

added = 0

if n<0:
    return 0

if n== 1 or n == 0:
    return 1

else:
    if (n-1) in memo.keys():
        f1 = memo[n-1]
    else:
        memo[n-1] = fibsum(n-1)
        f1 = memo[n-1]

    if (n-2) in memo.keys():
        f2 = memo[n-2]
    else:
        memo[n-2] = fibsum(n-2)
        f2 = memo[n-2]

    if f1+f2 < 44:
        if (f1+f2) % 2 == 0:
            added += f1+f2
            print ("look here",added)
            return added 

    print (f1+f2)   
    return f1 + f2          

我留下了一些打印语句,因为我想调试这个问题,但我没有运气。

编辑:我已经被链接到另一个问题,但在这种情况下,它是迭代完成的,如果可能的话,我想以递归方式进行

python recursion memoization
1个回答
1
投票

memoization对fib的大值没有帮助

但作为一个旁观者,分开你的逻辑。

def fib(n):
    """
     simple recursive fibonacci function
    """
    if n == 0:
       return 1
    return n + fib(n-1)

然后做一个通用的备忘录装饰器

def memoize(fn):
    cache = {}
    def _tokenize(*args,**kwargs):
        return str(args)+str(kwargs)
    def __inner(*args,**kwargs):
        token = _tokenize(*args,**kwargs)
        if token not in cache:
           cache[token] = fn(*args,**kwargs)
        return cache[token]

现在只要装饰一下你的简单递归函数就可以了

@memoize
def fib(n):
    """
     simple recursive fibonacci function
    """
    if n == 0:
       return 1
    return n + fib(n-1)

现在你可以使你的fibsum方法(也可以记忆它)。

@memoize
def get_fib_nums(n):
    if n == 0:
       return [1]
    return [n] + get_fib_nums(n)



@memoize
def fibevensum(n):
    return sum(n for n in get_fib_nums(n) if n%2 == 0)    
© www.soinside.com 2019 - 2024. All rights reserved.