 # Programming-Idioms #### History of Idiom 31 > diff from v18 to v19

Edit summary for version 19 :

#### Version 18

2015-09-09, 09:02:00

#### Version 19

2015-10-29, 14:05:13

# Idiom #31 Recursive factorial (simple)

Create recursive function f which returns the factorial of non-negative integer i, calculated from f(i-1)

# Idiom #31 Recursive factorial (simple)

Create recursive function f which returns the factorial of non-negative integer i, calculated from f(i-1)

##### Code
```f i = if i > 1 then f (i-1) * i else 1
```
##### Code
```f i = if i > 1 then f (i-1) * i else 1
```
##### Code
```f = Hash.new { |hash, i| hash[i] = i * hash[i -1] }
f = 1
f # => 25852016738884976640000```
##### Code
```f = Hash.new { |hash, i| hash[i] = i * hash[i -1] }
f = 1
f # => 25852016738884976640000```
Note that f is not a function but plain old Hash used as a cache for performance.
Note that f is not a function but plain old Hash used as a cache for performance.
##### Code
```type
TPositiveInt = 0..MaxInt;

function _f(_i: TPositiveInt): Integer;
begin
if (_i < 2) then
Result := 1
else
Result := _f(_i - 1);
end; ```
##### Code
```type
TPositiveInt = 0..MaxInt;

function _f(_i: TPositiveInt): Integer;
begin
if (_i < 2) then
Result := 1
else
Result := _f(_i - 1);
end; ```
The definition of type TPositiveInt allows for rangechecking on the input.
MaxInt is already defined in the language.
The definition of type TPositiveInt allows for rangechecking on the input.
MaxInt is already defined in the language.
##### Code
```unsigned int f(unsigned int i)
{
return i?i*f(i-1):1;
}```
##### Code
```unsigned int f(unsigned int i)
{
return i?i*f(i-1):1;
}```
Overflows for i>20 in 64bits and for i>12 in 32bits
Overflows for i>20 in 64bits and for i>12 in 32bits
##### Code
```function f(n) {
return n<2 ? 1 : n * f(n-1);
}```
##### Code
```function f(n) {
return n<2 ? 1 : n * f(n-1);
}```
##### Code
```sub f {
my \$n = shift;
return \$n<2 ? 1 : \$n * f(\$n-1);
}```
##### Code
```sub f {
my \$n = shift;
return \$n<2 ? 1 : \$n * f(\$n-1);
}```
##### Code
```int f(int i){
if(i==0)
return 1;
else
return i * f(i-1);
} ```
##### Code
```int f(int i){
if(i==0)
return 1;
else
return i * f(i-1);
} ```