在方案中获取反向列表“奇数位元素”

时间:2012-11-09 19:19:45

标签: scheme

我是计划的初学者,有人可以给我一些关于如何获得的想法,“列表中奇数位置的元素?”因此( 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])"))))

2 个答案:

答案 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的过程总是传递'()作为累加器的初始值是微不足道的。