class Factorial {
// Recursive definition
Int factorial1(Int x) {
return if (x == 0) 1
else x * this.factorial1(x - 1)
}
// Tail-recursive definition
Int factorial2_aux(Int x, Int acc) {
return if (x == 0) acc
else this.factorial2_aux(x - 1, acc * x)
}
Int factorial2(Int x) {
return this.factorial2_aux(x, 1)
}
// Iterative definition
Int factorial3(Int x) {
Int p = 1;
while (x > 0) {
p = p * x;
x = x - 1;
}
return p
}
}
class Example {
Null main() {
Factorial fac = new Factorial();
Int x = 5;
printInt(fac.factorial1(x));
printChar(10);
printInt(fac.factorial2(x));
printChar(10);
printInt(fac.factorial3(x));
printChar(10);
}
}
new Example().main()