2014-04-07 51 views
0

我正在选择方案来学习递归,我发现它对我非常好:D但是现在,我有一个问题。我如何做一个叫做thirds的函数来选择一个元素并跳过2并重复这个过程。因此,它返回从第一个元素一个新的列表,每个三重元素例如(thirds '(a b c d e f g h))的应该返回 (a d g)使用计划递归创建一个新列表

(DEFINE (thirds lst) 
(COND 
    ((NOT(list? lst)) (newline) "USAGE: (thirds [list])") 
    ((NULL? lst) lst) 
    ((NULL? (CDR lst)) (CAR lst)) 
    (ELSE (CONS (CAR lst) (thirds (CDR(CDR(CDR lst)))))))) 

这就是我的代码都试过,但没有任何真正的运气.. 任何帮助吗?

+0

你错过了一个基本案例。如果你列出的是两个元素长什么? – WorBlux

+0

这个问题已经被回答了几次__最后几天,[这里](http://stackoverflow.com/a/22827083/201359)是我自己的尝试。我想你们都在走相同的路线... –

回答

0

还有另一种方法来做到这一点,即创建一个辅助函数并传递索引。

(define (thirds L) 
(thirds-helper L 0)) 

(define (thirds-helper L i) 
(cond ((null? L) '()) 
     ((= 0 (modulo i 3)) 
     (cons (car L) 
       (thirds-helper (cdr L) (+ i 1)))) 
     (else (thirds-helper (cdr L) (+ i 1))))) 

为读者练习。你可以修改这个来挑选列表中任何给定的第n个值吗?