我想找到一种在函数中使用计数器的方法,其中计数器也是递归函数中的一个变量。一个这样的例子是一个程序,它获取一个列表,然后"筛选"。遍历它,直到它找到其中所有是i的倍数的数字:
(define (multiples-of lst) (lambda (i) (if (> i 3))
'()
(multiplefilter (ismultipleof (+ i 1)) (lst)))))
其中ismultipleof
检查每个列表的car是否为i + 1
的倍数(i从1开始),然后multiplefilter
是一个单独的函数,它丢弃列表中非i
倍数的任何值。所以如果我在列表中输入(1 2 3 4 5 6 7 8 9 10 11 12)
,输出就会是(6 12)
。最大的问题是如何让计数器在函数中工作。
下面是一个在执行过程中使用计数器的简单函数。range
只是返回一个从0到(- n - 1)的整数列表。编写一个增加计数器的程序也很容易。
(define (range n)
(let loop ((acc '())
(list-start (- n 1)))
(if (negative? list-start)
acc
(loop (cons list-start acc) (- list-start 1)))))
这个函数向下计数而不是向上计数,因为递归通常"倒着"构建列表。倒数只是避免了在递归结束时对acc
调用reverse
的需要。
for
循环。特别是,从尾部开始的递归是值得努力的,因为它不会"吹掉堆栈"。