3

だからここに私が使用したいいくつかの定義されたリストがあります:

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

私がやりたいのは、そのように実行する'middle'関数の再帰関数を作成することです。

MIDDLE :(真ん中の1番目)は、1番目の真ん中の要素だけで構成される1要素のリストを返す必要があります[または、1番目に偶数の要素があった場合は空のリストを返します]。あれは、

(middle '(a b c d e f g) ) 戻るべき/戻るだろう: (d)

(middle '(s t u v w x y z) ) 空の文字列を返す必要があります。

(middle '( (a b) c (d e d) c (b a) ) ) 返すべき/返されるはず: それは真ん中にあったものを含むリストであり、それ自体がたまたまリストであったことに( (d e d) ) 注意してください。( (d e d) )

私はそれを2つの問題に分けなければならないと思います。まず、リストのn番目の項を選択できる関数が必要です。私はそれを作成することについてほとんど知識がありません。次に、中期の位置と中期が存在するかどうかを判断する関数が必要です。(これも私はそれを作成する方法について最小限の知識を持っています。それから

(define middle
    (lambda (L)
        (if (middle? L)
        (nth-term (middle L) L)
        '())))

これが私のevens関数で、もっと簡単な方法があるかどうか知りたいです。

(define evens
    (lambda (L)
    (if (or (NULL? (cddr L)))
        '()
    (cons (cadr L) (evens (cddr L))))))
4

3 に答える 3

3

これを行う最も簡単な方法は、length 関数を使用してリストの長さを取得し、その長さが偶数でないことを確認することです (偶数の場合は空のリストを返します)。長さが奇数であることがわかったら、リストの長さの半分から 1 を引いたリストの要素を返します。結果はリストの真ん中です。実際のコードは次のようになります。

    (define (middle lis)
      (let ((list-length (length lis)))
        (if (even? list-length)
            '()
            (list (list-ref lis (/ (- list-length 1) 2))))))

件名の質問に答えるには、次のように list-ref プロシージャを使用してリストの n 番目の項目を取得します。

    > (list-ref '(a b c d) 2)
    'c

まだご不明な点がありましたら、お知らせください。明確にするために最善を尽くします。

于 2012-11-14T04:33:15.813 に答える
2

明らかな方法 (長さを計算する、2 で割る、リストをシークする) には、リストを 2 回通過する必要があります。

1 つのパスのみを必要とする別の方法を次に示します。

(define (middle lst)
  (letrec
    ((middle-odd
       (lambda (x y) (if (null? x) (list (car y)) (middle-even (cdr x) (cdr y)))))
     (middle-even
       (lambda (x y) (if (null? x) '() (middle-odd (cdr x) y)))))
    (middle-even lst lst)))
于 2012-11-14T12:34:33.837 に答える
2

答えは次のように少し改善できます。

(define (middle lst)
  (let ((len (length lst)))
    (if (even? len)
        '()
        (list (list-ref lst (quotient len 2))))))

中間要素のインデックスを取得する簡単な方法があることに注意してください。

于 2012-11-14T11:53:18.550 に答える