【问题标题】:How to write a recursive factorial function in Ruby?如何在 Ruby 中编写递归阶乘函数?
【发布时间】:2020-02-26 19:26:12
【问题描述】:

我只是想要一些关于如何在 Ruby 中编写递归阶乘函数的帮助。我有以下 lisp 代码,但我想在 Ruby 中做同样的事情。

(defun factorial (N)
    (if (= N 1) 1
        (* N (factorial (- N 1)))))

【问题讨论】:

  • 我正要问你为什么把我自己的问题联系起来,但后来我意识到哈哈。太棒了!
  • @Fab 这是一个完全相同的副本!
  • 逻辑错误:0! = 1

标签: ruby recursion lisp factorial


【解决方案1】:

以下是如何用 ruby​​ 编写代码:

def factorial(n)
  return 1 if n == 1
  n * factorial(n - 1)
end

factorial(5)
#=> 120
factorial(7)
#=> 5040

编辑 Stefan 的评论:

若要避免SystemStackError 值较大的n 错误,请使用tail-recursive 方法。还必须启用 Ruby 的 tailcall 优化。

# before edit
factorial(100_000).to_s.size
#=> stack level too deep (SystemStackError)

避免SystemStackError

RubyVM::InstructionSequence.compile_option = {
  tailcall_optimization: true,
  trace_instruction: false
}

RubyVM::InstructionSequence.new(<<-CODE).eval
  def factorial(n, acc = 1)
    return acc if n == 1
    factorial(n - 1, n * acc)
  end
CODE

puts factorial(100_000).to_s.size
#=> 456574

Resource 1 Resource 2

【讨论】:

  • 或者如果你在哪里更直接地翻译 lisp 代码:n == 1 ? 1 : n * factorial(n - 1),但我自己更喜欢保护版本。
  • 不确定 Lisp,但这个 Ruby 版本会导致n 的较大值的堆栈溢出。你可以把它变成tail-recursive 方法并启用Ruby的尾调用优化。
猜你喜欢
  • 2018-06-08
  • 2019-08-06
  • 1970-01-01
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 2015-04-19
  • 2018-05-16
  • 2021-01-25
相关资源
最近更新 更多