Factorial
rascal-0.41.2
Synopsis
Compute the factorial function.
Examples
The factorial
of a number n is defined as n * (n-1) * (n-2) * ... * 1.
Here is the Rascal version:
@synopsis{fac1 demonstrates the ternary conditional and recursion}
int fac1(int n) = n <= 0 ? 1 : n * fac1(n - 1); ❶
@synopsis{fac2 demonstrates overloading and dynamic dispatch with pattern matching}
int fac2(0) = 1; ❷
default int fac2(int n) = n * fac2(n - 1); ❸
@synopsis{fac3 demonstrates structured programming and recursion}
int fac3(int n) { ❹
if (n == 0)
return 1;
return n * fac3(n - 1);
}
- ❶
fac1is defined using a conditional expression to distinguish cases. - ❷
fac2distinguishes cases using pattern-based dispatch (Rascal Functions). Here the case for0is defined. - ❸ Here all other cases for
fac2are defined (as indicated by thedefaultkeyword). - ❹
fac3shows a more imperative implementation of factorial.
Here is how to use fac:
rascal>fac1(47);
int: 258623241511168180642964355153611979969197632389120000000000
NOTE: Indeed, Rascal supports arbitrary length numbers.
Here is an example of fac2:
rascal>fac2(47);
int: 258623241511168180642964355153611979969197632389120000000000
Benefits
- This simple demo shows how (recursive) Rascal functions work in three different ways.
Pitfalls
- Typically writing recursive functions can be avoided using Visit and Descendant, so this example isn't very exemplary of typical Rascal code.