미쳐 버릴거야 : 팩토리얼을위한 루비 함수는 어디에 있나요? 아니요, 튜토리얼 구현이 필요하지 않으며 라이브러리의 함수 만 원합니다. 수학이 아닙니다!
나는 의심하기 시작했습니다. 표준 라이브러리 기능입니까?
미쳐 버릴거야 : 팩토리얼을위한 루비 함수는 어디에 있나요? 아니요, 튜토리얼 구현이 필요하지 않으며 라이브러리의 함수 만 원합니다. 수학이 아닙니다!
나는 의심하기 시작했습니다. 표준 라이브러리 기능입니까?
(1..6).inject(:*)
좀 더 간결합니다.
(1..num).inject(:*)
여기서 경우 실패 num == 0
. (1..(num.zero? ? 1 : num)).inject(:*)
0 케이스에 대한 정답을 제공하고 nil
음수 매개 변수에 대해 리턴 합니다.
답변:
표준 라이브러리에는 계승 함수가 없습니다.
Math.gamma
방법을 예를 들어 stackoverflow.com/a/37352690/407213
표준 라이브러리에는 없지만 Integer 클래스를 확장 할 수 있습니다.
class Integer
def factorial_recursive
self <= 1 ? 1 : self * (self - 1).factorial
end
def factorial_iterative
f = 1; for i in 1..self; f *= i; end; f
end
alias :factorial :factorial_iterative
end
NB Iterative factorial은 명백한 성능상의 이유로 더 나은 선택입니다.
http://rosettacode.org/wiki/Factorial#Ruby 에서 뻔뻔스럽게 집어 넣은 제가 개인적으로 가장 좋아하는 것은
class Integer
def fact
(1..self).reduce(:*) || 1
end
end
>> 400.fact
=> 64034522846623895262347970319503005850702583026002959458684445942802397169186831436278478647463264676294350575035856810848298162883517435228961988646802997937341654150838162426461942352307046244325015114448670890662773914918117331955996440709549671345290477020322434911210797593280795101545372667251627877890009349763765710326350331533965349868386831339352024373788157786791506311858702618270169819740062983025308591298346162272304558339520759611505302236086810433297255194852674432232438669948422404232599805551610635942376961399231917134063858996537970147827206606320217379472010321356624613809077942304597360699567595836096158715129913822286578579549361617654480453222007825818400848436415591229454275384803558374518022675900061399560145595206127211192918105032491008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
이 구현은 또한 Rosetta Code에 나열된 변형 중에서 가장 빠릅니다.
|| 1
제로 케이스를 처리하기 위해 추가되었습니다 .
Mark Thomas 에게 감사와 감사를 표하며 , 좀 더 효율적이고 우아하며 모호한 버전이 있습니다.
class Integer
def fact
(2..self).reduce(1,:*)
end
end
reduce
: (1..self).reduce(1,:*)
.
(2..self).reduce(1,:*)
마이크로 효율성이 당신의 일이라면 실제로 사용할 수 있습니다 :)
수학에서, factorial of n
단지이다 gamma function of n+1
(참조 : http://en.wikipedia.org/wiki/Gamma_function )
Ruby는 원하는 경우 Math.gamma()
사용 Math.gamma(n+1)
하고 정수로 다시 캐스팅합니다.
Math.gamma
정수 매개 변수에 대해 계승으로 요약되는 함수를 사용할 수도 있습니다 .
class Integer
def !
(1..self).inject(:*)
end
end
!3 # => 6
!4 # => 24
class Integer ; def ! ; (1..self).inject(:*) ; end ; end
됐나요?
a
것을 일어나는 Integer
경우에 !a
... 이야기하기가 매우 어렵다 존재하는 버그의 원인이 될 수 있습니다. 경우 a
와 같은 큰 수를 될 일이 357264543
다음 프로세서가 큰 루프로 진행되며, 프로그램 작성의 모든 갑자기 느려지 왜 사람들이 궁금해 할
우리를 돕기 위해 참여하고 시간을 보낸 모든 분들을 높이 평가하며 여기에 나열된 솔루션의 벤치 마크를 공유하고 싶습니다. 매개 변수 :
반복 = 1000
n = 6
user system total real
Math.gamma(n+1) 0.000383 0.000106 0.000489 ( 0.000487)
(1..n).inject(:*) || 1 0.003986 0.000000 0.003986 ( 0.003987)
(1..n).reduce(1, :*) 0.003926 0.000000 0.003926 ( 0.004023)
1.upto(n) {|x| factorial *= x } 0.003748 0.011734 0.015482 ( 0.022795)
n = 10 인 경우
user system total real
0.000378 0.000102 0.000480 ( 0.000477)
0.004469 0.000007 0.004476 ( 0.004491)
0.004532 0.000024 0.004556 ( 0.005119)
0.027720 0.011211 0.038931 ( 0.058309)
Math.gamma(n+1)
것은 n> 22에 대해서만 근사치이므로 모든 사용 사례에 적합하지 않을 수 있습니다.
6.downto(1).inject(:*)