问题描述
我正在使用通常的斐波那契函数在递归中练习记忆。在我的第一次尝试中,我想到了这个:
def memFib(n,memo = [0,1]):
if n < 2:
return n
elif n > len(memo) - 1:
memo.append(memFib(n - 1,memo) + memFib(n - 2,memo))
return memo[n]
在这段代码中,我使用默认参数设置了第二个参数,以传递记忆值并绕过我可能从递归中获得的任何范围问题。在我的第二次尝试中,我想减少原始代码的递归调用次数,并且不使用参数来绕过范围界定问题,这是我能想到的最好的方法:
def memFib2(n,1]):
if n < 2:
return n
else:
if (n - 1) > len(memo) - 1:
memFib2(n - 1,memo)
memo.append(memo[n - 1] + memo[n - 2])
return memo[n]
如您所见,在我的第二次尝试中,我成功减少了递归调用的数量,但仍未弄清楚如何解决我的记忆化递归所涉及的范围界定问题。最初,第二次尝试没有第二个参数,并且 memo = [0,1] 在定义函数之后且在 if 语句,但代码引发了 IndexError ,因此我将其修改为当前的状态以使其正常工作。
我的问题是,第二次尝试如何更新列表 备忘录 ?在我的第一次尝试中,我了解了这种情况的发生,因为递归发生在 .append() 方法内部,因此增加了 memo > ,因为它来自递归。但是,在我的第二次尝试中情况并非如此,因为第二次尝试从递归中出来时,它仅返回附加在 memo 中的最新元素,但是由于递归发生在 .append() 方法我不明白 备忘录 的更新值是如何传递的的递归。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)