【问题标题】:Fibonacci summing and memoization [duplicate]斐波那契求和和记忆[重复]
【发布时间】:2020-05-23 19:05:47
【问题描述】:

我正在学习编程课程,有一个关于斐波那契和和递归的问题。 规则如下:

编写一个函数 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          

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

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

【问题讨论】:

  • 这是一个调试问题,但我建议将这个问题一分为二:一个是“fib()”函数,它返回任何值,另一个是要求偶数值并对它们求和。跨度>
  • 我这样做时的问题是,如果函数调用 n = 4*10**6(就像在提供给我们的测试用例中一样),它会达到最大递归深度,我想提前终止该函数会使该函数不会深入递归。我的问题是为什么总和不适用于添加的 += 部分

标签: python recursion memoization


【解决方案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)    

【讨论】:

  • 如果像 n=4*10**6 这样的东西,这仍然不会达到最大递归深度吗?
  • 因此我的开场白说,memoization 不会为你省钱......即使没有最大递归,计算大数仍然需要很长时间......所以我想我会给你更一般的建议会让你的代码更容易处理
猜你喜欢
  • 2021-08-17
  • 2011-12-14
  • 2020-08-19
  • 2019-06-04
  • 2015-10-19
  • 2017-07-25
  • 1970-01-01
  • 2021-11-17
  • 2018-11-09
相关资源
最近更新 更多