匿名函数的递归

匿名函数的递归

本着想写一篇 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)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值