在函数方案中使用计数器



我想找到一种在函数中使用计数器的方法,其中计数器也是递归函数中的一个变量。一个这样的例子是一个程序,它获取一个列表,然后"筛选"。遍历它,直到它找到其中所有是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的需要。

在Scheme中,迭代通常是通过递归完成的,而不是像在某些语言中那样使用for循环。特别是,从尾部开始的递归是值得努力的,因为它不会"吹掉堆栈"。

相关内容

  • 没有找到相关文章

最新更新