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

标签 ruby recursion lisp factorial

我只是想得到一些关于如何在 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 的评论:

要避免 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

关于ruby - 如何在 Ruby 中编写递归阶乘函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58643287/

相关文章:

ruby-on-rails - 工厂女孩似乎不喜欢 acts_as_singleton

ruby - Redis客户端连接超时

ruby - 为什么 Class#allocate 在 Ruby 中是公共(public)方法?

recursion - 打破递归函数

python - 递归地将项目添加到列表中

ruby - 你如何在 Jekyll 中按帖子计数对 site.tags 进行排序?

java - 使用递归函数在 Java 中进行垃圾收集

syntax - cond 变量没有值

lisp - Scheme中的Push和Pop怎么写?

loops - Common Lisp - 将函数应用于列表中的每个其他元素