匿名函数的递归

版权声明:欢迎转载,但请注明出处 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)

猜你喜欢

转载自blog.csdn.net/HaoDaWang/article/details/82902488