# Find the Factorial!

Create the shortest program or function that finds the factorial of a non-negative integer.

The factorial, represented with ! is defined as such

$$n!:=\begin{cases}1 & n=0\\n\cdot(n-1)!&n>0\end{cases}$$

In plain English the factorial of 0 is 1 and the factorial of n, where n is larger than 0 is n times the factorial of one less than n.

Your code should perform input and output using a standard methods.

Requirements:

• Does not use any built-in libraries that can calculate the factorial (this includes any form of eval)
• Can calculate factorials for numbers up to 125
• Can calculate the factorial for the number 0 (equal to 1)
• Completes in under a minute for numbers up to 125

The shortest submission wins, in the case of a tie the answer with the most votes at the time wins.

• How many of the given answers can actually compute up to 125! without integer overflow? Wasn't that one of the requirements? Are results as exponential approximations acceptable (ie 125 ! = 1.88267718 × 10^209)?
– Ami
Feb 6 '11 at 22:43
• @SHiNKiROU, even golfscript can manage 125! less than 1/10th of a second and it's and interpreted interpreted language! Feb 8 '11 at 3:21
• @ugoren the two-character solution to the other question uses a built-in factorial function. That's not allowed in this version of the challenge. Jan 7 '14 at 3:18
• Completes in under a minute seems a very hardware-dependent requirement. Completes in under a minute on what hardware? Aug 24 '17 at 18:05
• @sergiol Incredibly that hasn't been an issue in the last 2 years, I suspect most languages can get it done in under a minute. Aug 24 '17 at 21:20

## K, 9 bytes

f:*/1f+!:

k) f 125
1.882677e+209

Computes 125! in under a millisecond; 15ms for 10k iterations

– user45941
Jan 25 '16 at 14:48
• @Mego - it's en.wikipedia.org/wiki/K_(programming_language) I've just realised this is equivalent to Kona... Jan 25 '16 at 14:59

# Detour (non-competing), 5 bytes

?1RP.

Try it online!

?1 means "if n is 0, set n to 1"
RP means product [1..n], . is output

Terminates in 6ms for 170 (the highest number whose factorial can be represented in JS) on my craptop 4-year-old macbook air with 2GB RAM.

Here's a 100% symbolic method:

# Detour, 10 bytes

[{<]?1}&*.

Try it online!

Old recursive way:

<Q0\
.$;p>P Try it online! This is non-competing, as I just finished the language today. There's no good way to explain it, the website will give a visualization of the data flow at runtime. It's a shame I have to handle 0!=1, or this could be a one-liner. Another 11-byte solution (faster): # Detour, 11 bytes ?1[$Q<]x
P.

Try it online!

• @CᴏɴᴏʀO'Bʀɪᴇɴ as a matter of fact I am working on non-essentials such as permalinks and speed sliders now. :) Jan 21 '16 at 4:21
• Jan 21 '16 at 4:30
• @CᴏɴᴏʀO'Bʀɪᴇɴ done. Jan 21 '16 at 5:11

# Sage, 19 bytes

For some reason, Guido hates prod(). But, Sage supports it:

f=lambda n:prod(1..n)

edit: just had a statement previously, not a function

# Scheme - 33 characters

Improved answer using an unnamed procedure and the λ symbol.

(λ(n)(if(= 0 n)1(* n(!(- n 1)))))

(define(! n)(if(= 0 n)1(* n(!(- n 1)))))

The white-space requirement is almost as much of a problem as the brackets for bloating things in scheme.

Testing:

> ((λ(n) (if(= 0 n)1(* n(!(- n 1))))) 0)
1
> ((λ(n) (if(= 0 n)1(* n(!(- n 1))))) 125)
188267717688892609974376770249160085759540364871492425887598231508353156331613598866882932889495923133646405445930057740630161919341380597818883457558547055524326375565007131770880000000000000000000000000000000
• what about removing the space between define and (! n) Oct 13 '15 at 21:49
• Thanks NaN - can actually remove a lot of spaces so 47 down to 40. Oct 13 '15 at 22:12
• Doesn't work for me (the lambda one) - ! is undefined (running in DrRacket 6.4) Jun 9 '16 at 13:30

# Common Lisp, 38 bytes

Disclaimer: I'm not responsible for any traumatic effect caused by the extreme density of parentheses. It's the language specification's fault.

(defun a(b)(if(< b 2)1(*(a(- b 1))b)))

Ungolfed & explained:

(defun a (b)                               ;Define a function called "a". It has one parameter called "b"
(if (< b 2)                    ;If b is a number that is smaller than 2 (0 and 1 satisfy this)
1                   ;Return 1
(* (a (- b 1)) b)));Otherwise, return a(b-1) multiplied by b
• Hi, your solution does not handle the input value '0'; you should modify the code as follows: (defun a(b)(if(= b 0)1(*(a(- b 1))b))). Jun 6 '16 at 21:47
• You can save a byte by using (1- b) instead of (- b 1) Apr 12 '17 at 16:40

# PHP, 39 bytes

<?=array_product(range(1,$argv[1]))?:1; breakdown <?= // 4. print result array_product( // 2. get product of the elements - special: 0 range(1,$argv[1])    // 1. build array from 1 to N - special: [1,0]
)
?:1                      // 3. special: if falsy, return 1
;
• for($p=1;$i++<$argn;)$p*=$i;echo$p; is shorter and <?=array_product($argn?range(1,$argn):[]); is a more interesting way Jul 9 '17 at 0:41

## CJAM 9

I'm pretty sure this mmets all requirements. It ran on the online compiler for 125 is far less than a second.

1ri,{)*}%

It works as follows:

1         puts 1 on stack
ri        accepts input as integer
,         creates list of all non negative integers less than input
{         start block
increments integer by 1
multiplies current product by integer, current product starts with 1
}         repeat block for each element in list
• ri,1f+:* is even shorter Nov 4 '14 at 22:01
• Can you remove the -? It's throwing off the leaderboard snippet, thinks you're at negative 9 bytes. Jan 19 '17 at 2:10

# Ruby, 22 bytes

n.downto(1).inject(:*)
• Unfortunately, this doesn't work for 0, so you probably have to add a ternary operator. Nov 29 '14 at 20:05
• n.downto(1).inject(1,:*) Jul 24 '15 at 17:12
• Or in fact (1..n).inject 1,:* seems to work fine. Jul 24 '15 at 17:14

# Python, 30 bytes

f=lambda n:n*f(n-1)if n else 1

Saves some characters by using lambda syntax and a ternary if-else.

• This is very similar to the Python answer on the first page, and doesn't really add anything. Jun 22 '15 at 14:51
• Firstly, there are many Python answers. Secondly, which answers are on which page is dependent on how you sort the answers. Thirdly, even if my answer doesn't add anything super cool or unique, it's still different enough for me to post it as my own. Because it IS my own. I created it without reading the other answers first. Jun 22 '15 at 18:32
• There are five Python answers; two of them are exactly yours except that the authors used and/or rather than ternary or forgot to use lambda. If I had this solution, I would post it as an improvement comment on those answers due to similarity, or not post if there is no improvement. Jun 22 '15 at 18:46
• Using and/or instead of ternary is pretty different in Python for this challenge. Your feedback is appreciated, but I'm not removing my answer. This answer was posted 5 months ago and was fine. Jun 22 '15 at 18:51

# Brain-Flak, 52 bytes

Came up with the solution independently, thanks JoKing for telling me that it's possible to get 52 bytes.

<>(())<>{(({})<({<>({})<><({}[()])>}{})<>{}>[()])}<>

Try it online!

Ungolfed:

<>(())<>		# push 1 on the other stack
{			# while x:
(
({})			# copy x to the 3rd stack
<(			# push the
{			# running total of
<>({})<>		# top of the other stack
<({}[()])>		# (while decrementing x)
}
{}			# pop redundant 0
)<>{}>
[()]
)			# push x-1
}
<>

Try it online!

• It's interesting that you don't always end up on the same stack at the end. Here's my own 52 byte answer if anyone else is interested.
– Jo King
May 22 '18 at 6:26

# Julia 1.0, 12 bytes

n->prod(1:n)

Try it online!

## Keg, 16 bytes

(:|:1-)_(!1-|*).

This takes a top-of-stack item and returns [0..top]. Then, it discards the 0. After that, it multiplies everything in the stack, returning the factorial. (This is indeed too long.)

• Nicely golfed, I gave my own shot at this but was only able to get 18 bytes, +1 Aug 10 '19 at 11:38
• I'm getting an error running that code on TIO. Sep 25 '19 at 20:38
• Run this in an old version. (Works for most of my Keg answers)
– user85052
Sep 25 '19 at 22:42

# Python 3, 30 Bytes

f=lambda n:n*f(n-1)if n else 1

125! took less than 1 second to do on IDLE and TIO.

How it works: the function f returns n*f(n-1) if n is not 0 and it returns 1 otherwise, the definition of a factorial.

Try it online!

# JavaScript (Node.js), 17 bytes

Recursion. Usage of arrow function declaration and OR operator that checks whether x is 0 (if not, continue multiplying).

f=x=>!x||x*f(x-1)

Try it online!

# JavaScript, 41

function(n,r){for(r=1;n;r*=n--);return r}

or 39 if globals are okay.

## ><>, 18 22

Launch with -v number for inputting the argument, or put it before the one.

Now also handles 0, some more intelligent direction usage, and some more space for putting numbers up to ff* or 225:

1&:?\&n;
:-1&*&:/?=0

Old version

1&>:&*&\
;n&\?-1 /

JAVA

I rarely see Java solutions here. Why is that?

public static void main(String[] args)
{
int tot = 1;
for(int i = 1;i<=5;i++)
tot *= i;
System.out.println(tot);
}
• Yes, and it can calculate the factorial for 0. Put the factorial value in the loop continuation condition. i.e 5
– Mob
Aug 6 '11 at 11:17
• Java's a pretty verbose language, so it's not great for getting the lowest character count. Aug 6 '11 at 13:34
• @Gareth Yeah, but Brain Fuck isn't right?
– Mob
Aug 7 '11 at 19:13
• You asked why you rarely see Java solutions here - it's because Java's verbose and less likely to win at code-golf. That's not to say there are no Java solutions, or that people shouldn't post Java solutions - they're just rarer for that reason. Aug 7 '11 at 20:06
• This is code-golf. With barely any work at all, you can significantly reduce the length by removing unnecessary whitespace and using 1-letter variable names Feb 5 '16 at 6:30

### Scala, 39

def f(x:BigInt)=(BigInt(1)to x).product

## Ruby, 19

[1,*2..n].inject :*

The extra hardcoded 1 at the beginning makes it work for when n=0.
Ruby auto-converts to BigInt after a certain point, so it has 100% accuracy.

# C 20 characters

x(){while(n)f*=n--;}

Assuming f and n are global variables. Here is the entire program :

double n=5,f=1;

x(){while(n)f*=n--;}

main(){
x();
printf("%f",f);
}

# C 37 characters

double f(int n){return n?n*f(n-1):1;}

This returns the value but is slightly longer than my
previous answer which used global variables.

## Julia - 17

!n=n>1?n*!(n-1):1

This defines !n as !(n-1)*n if n>1, 1 otherwise. To make it work with big numbers you just need to make "n" a BigInt type (build in Julia).

And if its permitted (13 chars.):

!n=gamma(n+1)

with gamma equals to:

In the particular case that z its an integer the gamma function would be equal to:

Like its not a build in factorial it must not break the rules, but Im not posting it as solution just in case it does.

# JavaScript (ES6) - 17 Characters

f=x=>x?x*f(x-1):1

Or:

f=x=>!x||x*f(x-1)

# JavaScript - 17 Characters (not a function)

for(a=1;n;)a*=n--

Assumes that the variable n contains the number you want the factorial for and outputs the answer to the console and stores it in the variable a.

• But will this provide the full numeric value of 125!? Nov 5 '14 at 1:37
• @WallyWest yes, JavaScript has only one numeric type, Number. It is not arbitrary precision, but it can hold up to 170! Before overflow, at which point it is said to be Infinity. JS is weird?, but it is actually helpful in this case. Feb 5 '16 at 6:51
• Wow... I just looked at the similarities between my code and yours. Ours are basically the same. Jun 8 '16 at 19:30

the minimum solutions is already given using C# lamada. But just try to this another way.

var seq = Enumerable.Range(1, 5).ToList();
int O=1;    //O will contain Factorial or ouput
seq.ForEach(x=>O*=x);

# C#, just the relevant code, 59

(assuming the argument variable is called a)

Enumerable.Range(1,int.Parse(a[0])).Aggregate(1,(x,y)=>x*y)

## With boilerplate, 122

using System.Linq;class A{static int Main(string[] a){return Enumerable.Range(1,int.Parse(a[0])).Aggregate(1,(x,y)=>x*y);}

(note that this solution returns the result)