【发布时间】:2020-10-07 15:00:55
【问题描述】:
系统: Ubuntu 14
IDE: PyCharm 社区版 3.1.1
Python: 2.7.6
循环调用算法:
def fibonacci_dynamic(n):
if n == 0:
return 0
if n == 1:
return 1
computed_values = {1: 1, 2: 1}
return memoize(n, computed_values)
def memoize(n, computed_values):
if n in computed_values:
return computed_values[n]
#recurrent call
computed_values[n - 1] = memoize(n - 1, computed_values)
computed_values[n - 2] = memoize(n - 2, computed_values)
new_value = computed_values[n - 1] + computed_values[n - 2]
computed_values[n] = new_value
return new_value
测试:
from unittest import TestCase
from first.fib.fibonacci import fibonacci_dynamic
import sys
sys.setrecursionlimit(40000)
class TestFibonacci_dynamic_param(TestCase):
def test_fibonacci_dynamic_26175(self):
result = fibonacci_dynamic(26175)
self.assertIsNotNone(result)
测试中的值是预期的。围绕值 26175 测试有时会通过,但有时会以消息终止:
Process finished with exit code 139
我知道测试结果在某种程度上取决于硬件资源,但我正在从 stackoverflow 前辈那里寻找更准确的答案:)
【问题讨论】:
-
删除
sys.setrecursionlimit(40000),您将不会再收到该错误。这是因为调用堆栈溢出引起的。 (提示:如果您需要致电setrecursionlimit,则您的代码有问题)。 -
我需要这个,因为如果没有这个递归限制,我会收到错误'RuntimeError: maximum recursion depth exceeded'
-
您有 3 个选择:1) 使用
RuntimeException,您可以捕获并尝试处理它,2) 使用setrecursionlimit来避免异常但会出现分段错误(更大的输入),无法处理 3) 修复代码的实现以避免大量递归调用并计算更大的斐波那契数。 -
动态编程全部都是为了避免多次重复解决子问题。现在,您认为您的功能实现了这一点吗?您认为对
memoize执行递归调用的顺序重要吗? -
好点 - 当我在创建关于优化的演示文稿时出现了这个问题 - 所以为什么这个算法没有优化 - 我尝试获取结果以与迭代方法进行比较:)
标签: python python-2.7 ubuntu recursion pycharm