use std::ops::{Add, Sub}; fn f<T>(n: T) -> T where T: Clone + PartialEq + TryFrom<usize> + Add<Output=T> + Sub<Output=T> { let [zero, one, two] = [0, 1, 2].map(|n| T::try_from(n).ok().unwrap()); match n { n if n == zero => zero, n if n == one => one, n => f(n.clone() - one) + f(n - two), } }