版权声明:欢迎转载,但请注明出处 https://blog.csdn.net/HaoDaWang/article/details/82902488
匿名函数的递归
本着想写一篇 Lambda 演算 的博文,但是因为太懒了, 就写一篇比较短的匿名函数递归的博文吧,实际上两个有着不可切断的联系,Lambda 演算还是留着以后写吧
递归大家都知道,简单来说就是函数调用自身,但是匿名函数怎么来做递归呢?
在函数为一等公民的语言中,函数能够当作参数进行传递,并且允许匿名函数的存在。先看一个 js
实现 Fibonacci
的例子
let fibonacci = n => n < 2 ? 1 : fibonacci(n - 1) + fibonacci(n - 2)
如果现在把变量拿掉我们怎么来实现递归呢?没有一个可以标识这个函数的东西了。想想,lambda 中,可以用变量来替代任何东西,这里我们可以把函数当作参数传递进来。
let fibonacci = f => n => n < 2 ? 1 : f(f)(n - 1) + f(f)(n - 2)
调用,求fibonacci
的第三项
fibonacci(fibonacci)(3)
现在我们把fibonacci
彻底拿掉
于是变成
(f => n => n < 2 ? 1 : f(f)(n - 1) + f(f)(n - 2))(f => n => n < 2 ? 1 : f(f)(n - 1) + f(f)(n - 2))(3)
总的来看,还是太复杂了,并且有很多冗余的地方,其实可以用 Y不动点组合子
来简化
(f => (g=>f(a=>g(g)(a)))(g=>f(a=>g(g)(a))))(f=>n=>n>1?f(n-1)+f(n-2):n)(3)