我是计划的初学者,有人可以给我一些关于如何获得的想法,“列表中奇数位置的元素?”因此( A B C D G )
会返回( G C A)
。我反过来得到了清单,我现在需要拉其他所有数字。请帮忙。到目前为止,这是我的代码:
(define (list-rev lis)
(COND
((NULL? lis ) '())
((LIST? lis)
(append (oddrev (CDR lis)) ( list (CAR LIS))))
(ELSE (show " USAGE: (oddrev [LIST])"))))
答案 0 :(得分:1)
一种方法是使用带有两个参数的函数对列表进行单次传递:列表和布尔值。
如果布尔值为true,那么您希望cons
当前元素与已处理列表的其余部分。否则,您可以跳过当前元素并继续。您需要每次都翻转布尔值,因为您正在使用其他所有元素。
这有帮助吗?
如果你愿意,这是代码,但我建议你先自己尝试一下:
(define l '(A B C D G)) (define (orev lst acc) (if (null? lst) '() (if acc (cons (car lst) (orev (cdr lst) #f)) (orev (cdr lst) #t)))) (write (orev (reverse l) #t))
答案 1 :(得分:1)
使用累加器来存储答案 - 这将产生反向创建列表的效果(不需要使用append
!)并生成尾递归解决方案。因为这看起来像家庭作业,我会给你一些提示,所以你可以填写空白:
(define (odd-reverse lst acc)
(cond ((null? lst) ; if the list is null
<???>) ; return the empty list
(<???> ; if there's only one element left in the list
(cons <???> acc)) ; cons that element with the accumulator
(else ; otherwise advance the recursion
(odd-reverse <???> ; advance two positions over the list
(cons <???> acc))))) ; cons current element with the acc
这样称呼:
(odd-reverse '(A B C D G) '())
=> '(G C A)
如果过程必须只接收一个参数(列表),那么编写另一个调用odd-reverse
的过程总是传递'()
作为累加器的初始值是微不足道的。