问题: 设计一个消耗数字列表并生成的函数 列表中每个其他数字的列表。所以
(skip1 (list 1 4 2 6 9 5)) produces (list 1 2 9)
(define (skip1 lon0)
(local [(define (skip1 lon i)
(cond [(empty? lon) empty]
[else
(if (odd? i)
(cons (first lon)
(skip1 (rest lon) (add1 i)))
(skip1 (rest lon) (add1 i)))]))]
(skip1 lon0 1)))
任何人都可以在函数后解释它是如何工作的
答案 0 :(得分:1)
i
是一个累加器,用于跟踪您所在列表中的位置。蹦床调用以整个列表开始,因此初始位置仅为1
。在进行第一次递归调用后,第一个元素被剥离,因此新的起始位置为2
。这一直到你到达列表的末尾(比如说n
元素),此时i
为n
。
所以,你想要一个只将数字保持在奇数位置的函数,所以你想要丢弃那些不在奇数位置的函数。 (odd? i)
然后会告诉您lon
的第一个元素是否位于初始列表中的奇数位置。如果这个元素处于奇数位置,我们保留元素,并将其置于对列表其余部分的递归调用中,否则我们丢弃该项目并转移到递归调用。
尝试单步执行示例。 if
部分只是选择保留或不保留lon
的最后一个元素。