-1

これは正しい逆の方法ですか?次のリストからそのようにする「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 '()) 空のリストなどを返す/返すべきです。

このコードは正しいように見えますか?また、reverse コマンドをどのように組み込むことができますか?

(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)))))
4

2 に答える 2

1

これを行う最も簡単な方法は、リストの奇数要素を取得する(odd lis ) プロシージャを作成してから、奇数プロシージャを呼び出す(oddrev lis ) プロシージャを作成し、逆のプロシージャをその結果に適用することです。

奇妙な手順は次のようになります。

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

以上のことから、oddrev を定義する必要があります。この部分は簡単です。odd を呼び出してから、次のように逆にします。

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

DrRacket 5.3 でこれをテストして、機能することを確認しました。結果は、質問で概説した仕様に完全に準拠していました。コードに問題がある場合は、お知らせください。

于 2012-11-14T04:45:29.293 に答える
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 を再帰的に使用することは、追加の引数として null リストを使用してヘルパーを呼び出し、その上にリストを作成することによって、それを行うためのより良い方法があることを示す良いシグナルです。

于 2013-05-09T00:00:51.543 に答える