我有以下代码失败,出现以下错误:
RuntimeError:超出最大递归深度
我试图重写它以允许尾递归优化(TCO).我相信如果发生TCO,这段代码应该是成功的.
def trisum(n, csum):
if n == 0:
return csum
else:
return trisum(n - 1, csum + n)
print(trisum(1000, 0))
Run Code Online (Sandbox Code Playgroud)
我是否应该断定Python不执行任何类型的TCO,或者我只是需要以不同的方式定义它?
我常常在ruby中加入的一件事是递归模式.例如,假设我有一个数组,并且可能包含数组作为无限深度的元素.所以,例如:
my_array = [1, [2, 3, [4, 5, [6, 7]]]]
Run Code Online (Sandbox Code Playgroud)
我想创建一个可以将数组展平的方法[1, 2, 3, 4, 5, 6, 7].
我知道.flatten会做这个工作,但这个问题是我经常遇到的递归问题的一个例子 - 因此我试图找到一个更可重用的解决方案.
简而言之 - 我猜这种东西有一个标准模式,但我无法想出任何特别优雅的东西.任何想法都赞赏
以下函数为n = 5,000生成"堆栈级别太深(SystemStackError)"
def factorial(n)
n == 0 ? 1 : factorial(n -1) * n
end
Run Code Online (Sandbox Code Playgroud)
有没有办法使用continuation/callcc来避免这个错误?
注意:
我知道这可以在没有递归的情况下实现.例如
def factorial2(n)
(1..n).inject(1) {|result, n| result * n }
end
Run Code Online (Sandbox Code Playgroud) 我有兴趣比较ruby speed和python,所以我采用了最简单的递归计算,即打印fibonacci sequance.
这是python代码
#!/usr/bin/python2.7
def fib(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fib(n-1)+fib(n-2)
i = 0
while i < 35:
print fib(i)
i = i + 1
Run Code Online (Sandbox Code Playgroud)
这是红宝石代码
#!/usr/bin/ruby
def fib(n)
if n == 0
return 0
elsif n == 1
return 1
else
fib(n-1)+fib(n-2)
end
end
i = 0
while (i < 35)
puts fib(i)
i = i + 1
end
Run Code Online (Sandbox Code Playgroud)
在几次运行中,时间报告此平均值
real 0m4.782s
user 0m4.763s
sys 0m0.010s
Run Code Online (Sandbox Code Playgroud)
多数民众赞成红宝石,现在python2.7给出
real …Run Code Online (Sandbox Code Playgroud)