use std::cell::Cell; use std::cell::RefCell; use std::rc::Rc; use std::rc::Weak; fn a( k: i32, x1: &dyn Fn() -> i32, x2: &dyn Fn() -> i32, x3: &dyn Fn() -> i32, x4: &dyn Fn() -> i32, x5: &dyn Fn() -> i32, ) -> i32 { let weak_holder: Rc i32>>> = Rc::new(RefCell::new(Weak:: i32>::new())); let weak_holder2 = weak_holder.clone(); let k_holder = Cell::new(k); let b: Rc i32> = Rc::new(move || { let b = weak_holder2.borrow().upgrade().unwrap(); k_holder.set(k_holder.get() - 1); return a(k_holder.get(), &*b, x1, x2, x3, x4); }); weak_holder.replace(Rc::downgrade(&b)); return if k <= 0 { x4() + x5() } else { b() }; } pub fn main() { println!("{}", a(10, &|| 1, &|| -1, &|| -1, &|| 1, &|| 0)); }