| #![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) |
| } |