Anonymous Recursion
Sometimes we have recursion, other times we have anonymous functions... how about both? :-D
Scheme
Normal factorial function.
(define (fact n)
(if (zero? n) 1
(* n (fact (- n 1)))))
If we have no function name to call, we have to receive the function as an argument.
(lambda (f)
(lambda (n)
(if (zero? n) 1
(* n ((f f) (- n 1))))))
Anonymous function called with an equal function as an argument so that is has a function to call.
((lambda (f)
(lambda (n)
(if (zero? n) 1
(* n ((f f) (- n 1))))))
(lambda (f)
(lambda (n)
(if (zero? n) 1
(* n ((f f) (- n 1)))))))
Wrap the above in another lambda to have the function being called with itself.
((lambda (r) (r r))
(lambda (f)
(lambda (n)
(if (zero? n) 1
(* n ((f f) (- n 1)))))))
Run the above with a number.
(print (((lambda (r) (r r))
(lambda (f)
(lambda (n)
(if (zero? n) 1
(* n ((f f) (- n 1))))))) 5))
120
Python
>>> (lambda r:r(r)) (lambda f: (lambda n:((n==0)and 1 or(n*f(f)(n-1)))) ) (5)
120