0

さて、私は最近、以下の定義済みリストから呼び出される関数を生成する再帰関数をSchemeで作成することに関する質問を投稿しました:

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

私の偶数関数のために、私はこの再帰関数を作成しました:

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

しかし今、私はそのようなことをする「oddrev」関数を作成しようとしています: (oddrev 1st) これは、1st から取得した奇数番号の要素から形成された新しいリストを返す必要がありますが、元の順序とは逆です。それは私が入力した場合です:

(oddrev '(a b c d e f g))

返される/返す必要がある: (geca)

(oddrev (LIST 's 't 'u 'v 'w 'x 'y 'z))

返される/返す必要がある: (ywus)

(oddrev '((h i) (j k) l (m n)))

返される/返す必要がある:

(l (h i))

(oddrev '())

空のリストなどを返す/返すべきです。

誰かがこれがどのように見えるかを教えてくれるかどうか疑問に思っています. 私は将来の参考のためにスキームを学ぼうとしており、それはクールなプログラミング言語だと聞いていますが、今のところ、いくつかの困難にぶつかっています。新しい人への助けをいただければ幸いです。ありがとうございました

4

1 に答える 1

0

それを部分に分解して、まずすべての奇妙な要素を取得します。

偶数を取得するためのこの素敵な小さな関数が既にあるのに、それを使用してオッズを取得するにはどうすればよいでしょうか? (do-evens lst #t)実際には偶数で始まったと伝えたらどうなるでしょうか(do-evens lst #f)。これで、すべての奇数要素を取得できます。わかりやすくするために、この関数の本体で偶数 => 奇数に変更したい場合があります (単純な検索置換で問題なく動作します)。

次に、それを逆にする必要があります。これを行うには、手動または Scheme ライブラリ経由の 2 つの方法があります。手作業でやりたい場合は、その課題に取り組みましょう。そうでなければreverse、私たちのためにその仕事をします。

これらの 2 つの手順を組み合わせる方法を説明します。難しすぎない!幸せな計画

于 2012-11-13T05:51:59.533 に答える