返回的计划程序

时间:2012-11-14 02:49:09

标签: lisp scheme

这是正确的反向方法,我想创建一个'oddrev'函数,从下面的列表中这样做:

(DEFINE list0 (LIST 'j 'k 'l 'm 'n 'o 'j) )
(DEFINE list1 (LIST 'a 'b 'c 'd 'e 'f 'g) )
(DEFINE list2 (LIST 's 't 'u 'v 'w 'x 'y 'z) )
(DEFINE list3 (LIST 'j 'k 'l 'm 'l 'k 'j) )
(DEFINE list4 (LIST 'n 'o 'p 'q 'q 'p 'o 'n) )
(DEFINE list5 '( (a b) c (d e d) c (a b) ) )
(DEFINE list6 '( (h i) (j k) l (m n) ) )
(DEFINE list7 (f (a b) c (d e d) (b a) f) )

(oddrev '(a b c d e f g)) 会/应该返回: (g e c a)

(oddrev (LIST 's 't 'u 'v 'w 'x 'y 'z)) 会/应该返回: (y w u s)

(oddrev '((h i) (j k) l (m n))) 会/应该返回: (l (h i))

(oddrev '()) 会/应该返回一个空列表等等。

此代码看起来是否正确以及如何将反向命令合并到其中:

(define mylist '(1 2 3 4 5 6 7))
(define (oddrev lst)
(define (do-oddrev lst odd)
    (if (null? lst)
        lst
    (if even
        (do-oddrev (cdr lst) #f)
        (reverse (cons (car lst) (do-oddrev (cdr lst) #t))))))
        (do-evens lst #f))

或者我应该这样做:

(define (oddrev 1st)
    (if (NULL? 1st) '()
        (append (reverse (cdr 1st)) (list (car 1st)))))

2 个答案:

答案 0 :(得分:1)

最简单的方法是构建一个(奇怪的 lis )过程,它将获取列表中的奇数元素,然后创建一个(oddrev lis )过程调用奇数过程,并对其结果应用相反的过程。

奇怪的程序应如下所示:

    (define (odd lis)
      (if (null? lis)
          '()
          (if (= (length lis) 1)
              (list (car lis))
              (cons (car lis) (odd (cddr lis))))))

鉴于此,我们现在必须定义oddrev。这部分很简单,只需调用奇数,然后将其反转,如下所示:

    (define (oddrev lis)
      (reverse (odd lis))

我在DrRacket 5.3中对此进行了测试以确保其有效,并且结果与您的问题中列出的规格完全一致。如果您对代码有任何疑问,请与我们联系。

答案 1 :(得分:0)

(define (oddrev L)
 (oddrev-helper L '()))

 (define (oddrev-helper L-in L-out)
  (cond 
   ((null? L-in) L-out)
   ((null? (cdr L-in)) (cons (car L-in) L-out))
   (else (oddrev-helper (cddr l-in) (cons (car L-in) L-out)))))

递归地使用append通常是一个很好的信号,有一个更好的方法,通常通过调用一个带有空列表作为附加参数的帮助器并在此基础上构建列表。