博士球拍累积器有助于理解

时间:2013-12-09 00:44:19

标签: racket

问题:   设计一个消耗数字列表并生成的函数   列表中每个其他数字的列表。所以

 (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)))

任何人都可以在函数后解释它是如何工作的

1 个答案:

答案 0 :(得分:1)

哈哈,我知道这个课程的来源。你去UBC吧?无论如何......

i是一个累加器,用于跟踪您所在列表中的位置。蹦床调用以整个列表开始,因此初始位置仅为1。在进行第一次递归调用后,第一个元素被剥离,因此新的起始位置为2。这一直到你到达列表的末尾(比如说n元素),此时in

所以,你想要一个只将数字保持在奇数位置的函数,所以你想要丢弃那些不在奇数位置的函数。 (odd? i)然后会告诉您lon的第一个元素是否位于初始列表中的奇数位置。如果这个元素处于奇数位置,我们保留元素,并将其置于对列表其余部分的递归调用中,否则我们丢弃该项目并转移到递归调用。

尝试单步执行示例。 if部分只是选择保留或不保留lon的最后一个元素。