由于某种原因,在面对左递归时,Ruby 似乎表现更佳。例如:
def left_recursive_factorial(number)
return 1 if number.zero?
left_recursive_factorial(number.pred) * number
end
def right_recursive_factorial(number)
return 1 if number.zero?
number * right_recursive_factorial(number.pred)
end
当我使用超过9000的值调用这些方法时,我会得到不同的结果:
left_recursive_factorial(9001)
# => factorial of 9001
right_recursive_factorial(9001)
# => SystemStackError: stack level too deep
# from (pry):6:in `right_recursive_factorial'
我找不到任何关于这种行为的解释。
唯一看起来有点相关的是有关 LL()
解析器在处理左递归时存在问题,我想你可以将其翻转过来,但我没有深入研究过。
是否有人能够更详细地解释左递归和右递归在不同情况下(通常和特别在 Ruby 中)执行不同的原因,并且如果你可以选择其中之一,你会选择哪一个(为什么 Ruby 选择了左)?