匿名函数的递归

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

© XGFan 2012-2025