我在Scheme中实现这个程序时遇到了一些麻烦,尽管我认为我有90%的方式。不幸的是,我需要对它有点模糊,因为这是一个家庭作业。 我想(A B C D)返回(B D)。但我得到一个错误,说明对象()作为参数传递给安全车,不是一对 | " 这是我的代码:
(DEFINE (other_el lis)
(COND
(( NULL? lis ) '())
((LIST? lis)
(append (CADR lis) (other_el (CDR lis))))
(ELSE (show " USAGE: (other_el [LIST])"))))
答案 0 :(得分:2)
这个比你提到的上一个问题简单得多。请记住,您不必计算每一步的长度(可能非常低效),或使用追加操作来解决它(使用cons
代替);这是答案的结构,因为它看起来像家庭作业我会让你填补空白:
(define (every-other lst)
(if (or <???> ; if the list is empty
<???>) ; or the list has a single element
<???> ; then return the empty list
(cons <???> ; otherwise `cons` the second element
(every-other <???>)))) ; and recursively advance two elements
如果您需要先进行错误检查,请使用其他函数,并在确定参数正确后调用上述步骤:
(define (other_el lst)
(if (list? lst)
(every-other lst)
(error "USAGE: (other_el [LIST])")))
像这样使用:
(other_el '(A B C D E G))
=> '(B D G)
答案 1 :(得分:1)
在演示正确的代码之前,应该提及此代码存在许多小问题。
无论如何,这是你正在寻找的功能:
(define (evens lst)
(if (or (null? lst) ; if the list is empty
(null? (cdr lst))) ; or the list has a single element
'() ; then return the empty list
(cons (cadr lst) ; otherwise `cons` the second element
(evens (cddr lst))))) ; and recursively advance two elements
我在DrRacket 5.3中测试了该函数,并且(evens'(A B C D))返回'(B D),如您所指定。如果您有任何问题,请告诉我。祝你的作业好运!