匿名函数的递归
type
status
date
slug
summary
tags
category
icon
password
一个简单的递归求列表长度:
如果不允许使用
define,如何实现?先实现一个最简单版本,当列表为空时成立。
先忽略
......处,显然,当l为空的时候,能得到正确返回0。就叫它lenght0吧。依托已有的这个函数,来实现当list为1的时候,也能正确返回的函数:
可以看出
- 和空列表版本几乎一致,唯一的区别是
......和length0
- 由于不让使用
define,所以无法直接使用lenght0,需要代换
最终
length1如下:再进一步,得到
length2,如下:如果一直这样写下去,就会得到一个三角形的函数,尝试抽取一部分逻辑,现在已经知道:如果有
lengthN函数,那lenghtN+1就是如下由于没有
define,所以只能将lengthN作为一个参数传入:重写length0和length1
现在可以看出嵌套不再是一个突出的三角形了,但是还有进一步改善的空间。
总结一下上面的三个
lambda,用数学函数可以表达成这样显然,我们可以把f给抽出来,它的实际作用是使用
lengthN,构造lengthN+1,那就先叫他mk-length吧。再次代换出
length0和length1现在重新来看一直被忽略的
......,会发现:......不应该被调用
- 当
lengthN支持的N足够大时,......也不会被调用
目前的代码是无法运行的,因为不存在
......这个identifier,但只要使用任意合法identifier代替......都能使length0正常运行。由于在
length0的上下文里除了新的常量或者atom,就只有mk-length可以用,那就用mk-length吧。用
mk-length代替......还有一个额外的惊喜,为函数lengthN带来了更多的表现形式,因为现在参数lengthN实际上就是mk-length,再次观察一下length0会发现
看画线处,就能知道,距离递归只有一步,只需要将做🤏修改,就能达到递归的效果
所以,最终的递归版本
length为Loading...