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