Как написать рекурсивную факториальную функцию в Ruby? - PullRequest
4 голосов
/ 31 октября 2019

Мне просто нужна помощь с тем, как написать рекурсивную факториальную функцию в Ruby. У меня есть следующий код, который является lisp, но я хочу сделать то же самое в Ruby.

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

1 Ответ

5 голосов
/ 31 октября 2019

Вот как написать свой код в ruby:

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

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

Редактировать комментарий Стефана:

Чтобы избежать ошибки SystemStackError с большими значениямиn, используйте хвост-рекурсивный метод. Также должна быть включена оптимизация 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

Ресурс 1 Ресурс 2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...