如何在Ruby中编写递归阶乘函数?

如何在Ruby中编写递归阶乘函数?,ruby,recursion,lisp,factorial,Ruby,Recursion,Lisp,Factorial,我只是想得到一些关于如何在Ruby中编写递归阶乘函数的帮助。我有以下lisp代码,但我想在Ruby中做同样的事情 (defun阶乘(N) (如果(=n1)1 (*N(阶乘(-n1(()))) 以下是如何用ruby编写代码: def factorial(n) return 1 if n == 1 n * factorial(n - 1) end factorial(5) #=> 120 factorial(7) #=> 5040 编辑Stefan的评论: 要避免出现Syst

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

(defun阶乘(N)
(如果(=n1)1
(*N(阶乘(-n1(())))

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

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

factorial(5)
#=> 120
factorial(7)
#=> 5040
编辑Stefan的评论:

要避免出现
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
RubyVM::InstructionSequence.compile\u选项={
tailcall_优化:正确,
trace\u指令:false
}

RubyVM::InstructionSequence.new(我正要问你为什么把我自己的问题链接起来,但后来我意识到lol.Bravo!@Fab这是一个完全重复的问题!逻辑错误:0!=1或者如果你更确切地翻译lisp代码的话:
n==1?1:n*阶乘(n-1)
,但我自己更喜欢guard版本。对Lisp不太确定,但是这个Ruby版本会导致
n
的大值出现堆栈溢出。您可以将其转化为一种方法,并启用Ruby的尾部调用优化。