3

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

2 回答 2

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

于 2012-11-09T19:45:59.330 回答
1

一种方法是使用带有两个参数的函数对列表进行单次传递:列表和布尔值。

如果布尔值为真,那么您希望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))

于 2012-11-09T19:35:00.207 回答