Calculate the factorial of a number

From CodeCodex

These while loops will calculate the Factorial of a number.

In mathematics, the factorial of a number (that cannot be negative and must be an integer) n, denoted by n!, is the product of all positive integers less than or equal to n. For example: 5! is 5*4*3*2*1.

Contents

[edit] Implementations

[edit] C/C++

Calculate a factorial recursively in C:


unsigned long factorial(unsigned long f)
{
        if (f) return(f * factorial(f - 1))
        return 1;
}

printf("%i", factorial(5));

Calculate a factorial iteratively in C:


unsigned int counter = 5;
unsigned long factorial = 1;

while (counter > 0)
factorial *= counter--; /*Multiply, then decrement.*/

printf("%i", factorial);

[edit] C++


#include <numeric>
#include <functional>

int factorial(int num) {
        int *array = new int[num];
        for (int i = 0; i < num; i++)
        array[i] = i+1;
        int result = std::accumulate(array, array+num, 1, std::multiplies<int>());
        delete [] array;
        return result;
}

[edit] Common Lisp


;;; This is tail recursive. Remember that tail-recursion optimization isn't
;;; enabled by default in most CL compilers and interpreters
(defun ! (n)
(labels
((fact1 (n m)
(if (zerop n)
m
(fact1 (1- n) (* m n)))))
(fact1 n 1)))

This is an optimized algorithm, you can find more about it and some other ways to increase its performance at [1].


(defun ! (n)
(let ((shift 0))
(labels ((fact1 (n m)
(cond
((and (evenp n) (> m 1))
(incf shift (ash n -1))
(fact1 (ash n -1) (ash m -1)))
((<= n m) n)
(t (* (fact1 n (ash m 1)) (fact1 (- n m)(ash m 1)))))))
(ash (fact1 n 1) shift))))

[edit] Java, C#

The code for the loop is the same for Java and C#:

Note: if you intend to use the program to generate large factorials (such as 20!, 50! etc.) then you should store and return the factorial as a BigInteger rather than a long or int.


int counter = 5;
long factorial = counter;
while (counter > 1)
factorial *= --counter; // Multiply the decremented number.
//!n = n*(n-1)

For Java the result is printed as follows:


System.out.println(factorial);

The equivalent in C# is:


System.Console.WriteLine(factorial);

Rather than using a loop, use a recursive method:


/**
* A recursive factorial calculation method
*
* @param n the number to be factored
* @return the factorial of n
*/
public static int factorial(int n) {
        return ((n == 0) ? 1 : n * factorial(n - 1));
}

[edit] Haskell

fact :: (Integral a) => a -> a
fact 0 = 1
fact n = n * fact (n-1)

For example:

> fact 5
120

A one-liner:

fact n = product [1..n]

Or more verbosely:

fact n = foldl (*) 1 [1..n]

Pointfree:

fact = product . enumFromTo 1

[edit] OCaml

[edit] Example 1

 # let rec fact = function
     | 0 -> 1
     | n -> n * fact(n-1);;
 val fact : int -> int = <fun>

For example:

 # fact 5;;
 - : int = 120

[edit] Example 2

# let rec f n = if n=0 then 1 else n*f(n-1);;
val f : int -> int = <fun>

For example:

# f 5;;
- : int = 120


[edit] Example 3

# let fact n =
  let rec loop n acc = match n with
    | 0 -> acc
    | _ -> loop (n - 1) (n * acc)
  in loop n 1;;
val f : int -> int = <fun>

For example:

# fact 10;;
- : int = 3628800

[edit] Pascal

program Factorial
var
  Counter, Factorial: integer;
begin
  Counter := 5;
  Factorial := 1;
  while Counter > 0 do begin
    Factorial := Factorial * Counter;
    Counter := Counter - 1;
  end;
  Write(Factorial);
end.

[edit] Perl

Memoized example:


my %table;
$table{0} = 1; # Manually linking input '0' to output '1' in the look-up table.

sub factorial {
        my $number = shift;
        my $factorial;

        if ( exists $table{$number} ) {
                return $table{$number}; # Input found in the look-up table, returning stored value.
        }
        else {
                $factorial = factorial($number - 1) * $number;
        }

        $table{$number} = $factorial; # Inserting newly calculated value into new table.

        return $factorial;
}

factorial(24);

sub factorial {
        my $n = shift;
        my $f = 1;
        $f *= $n-- while $n > 0;    # Multiply, then decrement
        return $f;
}

sub recursive_factorial {
        my $n = shift;
        return $n * recursive_factorial($n - 1) if $n;
        return 1;
}

sub functional_factorial {
        my $n = shift;
        return $n * recursive_factorial($n - 1) if $n;
        return 1;
}

print factorial 5;
print recursive_factorial 5;

use List::Util qw(reduce);

sub functional_factorial {
        my $n = shift;
        return reduce {$a * $b} 1, 1..$n; # the extra "1" enables it to work for n = 0
}

[edit] Python


import operator
def factorial(num):
    return reduce(operator.mul, range(1, num + 1), 1) # the "1" initial value allows it to work for 0

in Python 2.6+:


import math
math.factorial(num)

[edit] Ruby


def factorial(num)
(1..num).inject(1) {|a, b| a * b} # the "1" initial value allows it to work for 0
end

or shorter


def factorial(num)
(1..num).reduce(:*)
end

[edit] QBasic / Visual Basic

Dim counter as Integer : counter = 5
Dim factorial as Long : factorial = 1
While (counter > 0)
  factorial = factorial * counter     'Multiply
  counter = counter - 1               'Decrement
Wend
Print factorial                       'Prints out the result.

[edit] REALbasic

Dim counter as Integer = 5
Dim factorial as Integer = 1
While counter > 0
  factorial = factorial * counter     //Multiply
  counter = counter - 1               //Decrement
Wend
MsgBox Str( factorial )               // Prints out the result.

[edit] Scheme

Recursive:


(define (fac n)
(if (= n 0)
1
(* n (fac (- n 1)))))
;give fac a value of 5
(fac 5)

Iterative:


(define (fac-iter n)
(let loop ((i n)
(result 1))
(if (= n 0)
result
(loop (- n 1) (* result n)))))

[edit] Tcl (Tool command language)

set counter 5
set factorial 1
while {$counter > 0} {
  set factorial [expr $factorial * $counter] 
  incr counter -1 
}
puts $factorial
proc factorial n {
  if {$n <= 0} {
    return 1
  } else {
    return [expr {$n * [factorial [expr {$n - 1}]]}]
  }
}

[edit] Zsh

factorial() {
	local -F1 a
	local b number
	a=1 ; b=1
	number=5 # Limited to 170
	while (( b++ < number )) { (( a = a * b )) }
	print "${a%.*}"
}

Or

number=({1..5})
print $((${(j:*:)number}))

Or using GNU tools

seq -s \* 5 | bc

[edit] Source