我想请你帮忙翻译如何在 Ruby 中编写递归阶乘函数的方法。以下是我的代码,它是 Lisp 语言的,但我想在 Ruby 中实现相同的功能。
(defun factorial (N)
(if (= N 1) 1
(* N (factorial (- N 1)))))
我想请你帮忙翻译如何在 Ruby 中编写递归阶乘函数的方法。以下是我的代码,它是 Lisp 语言的,但我想在 Ruby 中实现相同的功能。
(defun factorial (N)
(if (= N 1) 1
(* N (factorial (- N 1)))))
以下是如何使用 Ruby 编写您的代码:
def factorial(n)
return 1 if n == 1
n * factorial(n - 1)
end
factorial(5)
#=> 120
factorial(7)
#=> 5040
根据Stefan的评论进行编辑:
为了避免在n
值较大时出现SystemStackError
错误,可以使用尾递归方法。同时需要启用Ruby的tailcall
优化。
# before edit
factorial(100_000).to_s.size
#=> stack level too deep (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
这两个资源与Ruby中的递归和尾调用优化相关。n == 1 ? 1 : n * factorial(n - 1)
,但我个人更喜欢使用保护版本。 - 3limin4t0r