class Factorial { // Recursive definition def factorial1(x: Int): Int = { var res: Int = 1; if (x > 0) set res = x * this.factorial1(x - 1); return res }; // Tail-recursive definition def factorial2_aux(x: Int, acc: Int): Int = { var res: Int = acc; if (x > 0) set res = this.factorial2_aux(x - 1, acc * x); return res }; 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; } return p }; } { 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); }