blob: f620070639801c32b1815090a37aa1f27230da5d [file] [log] [blame]
#![allow(incomplete_features)]
#![feature(explicit_tail_calls)]
fn main() {
assert_eq!(factorial(10), 3_628_800);
assert_eq!(mutually_recursive_identity(1000), 1000);
}
fn factorial(n: u32) -> u32 {
fn factorial_acc(n: u32, acc: u32) -> u32 {
match n {
0 => acc,
_ => become factorial_acc(n - 1, acc * n),
}
}
factorial_acc(n, 1)
}
// this is of course very silly, but we need to demonstrate mutual recursion somehow so...
fn mutually_recursive_identity(x: u32) -> u32 {
fn switch(src: u32, tgt: u32) -> u32 {
match src {
0 => tgt,
_ if src % 7 == 0 => become advance_with_extra_steps(src, tgt),
_ => become advance(src, tgt),
}
}
fn advance(src: u32, tgt: u32) -> u32 {
become switch(src - 1, tgt + 1)
}
fn advance_with_extra_steps(src: u32, tgt: u32) -> u32 {
become advance(src, tgt)
}
switch(x, 0)
}