匿名函数的递归
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...