1

要素の前半部分を含むリストを返す手続き (first-half lst) を書きなさい。指定されたリストの長さが奇数の場合、返されるリストには (長さ - 1) / 2 要素が必要です。

私は例としてこれらのプログラムを与えられました。私はSchemeを初めて使用するので、この問題を解決するにはあなたの助けが必要です.

(define list-head 
   (lambda (lst k)
      (if (= k 0)
         '()
          (cons (car lst)(list-head (cdr lst)(- k 1)))))))

(list-head '(0 1 2 3 4) 3)   
; list the first 3 element in the list (list 0 1 2)

また、私が望むプログラムの期待される出力は次のとおりです。

(first-half '(43 23 14 5 9 57 0 125))
(43 23 14 5)
4

3 に答える 3

4

これは、既存の手順に関して実装するのは非常に簡単です。take手順の可用性については、インタープリターのドキュメントを確認してください。

(define (first-half lst)
  (take lst (quotient (length lst) 2)))

それとは別に、質問で提供されたコードは基本的に再発明されており、take正しいように見えます。実装するために残された唯一の詳細は、リストの長さの半分を取得する方法ですか? 上記と同じですが、次のquotient手順を使用してください。

(define (first-half lst)
  (list-head lst (quotient (length lst) 2)))
于 2013-06-27T20:29:25.690 に答える
2

再帰について学んでいるようですか?再帰的なアプローチの 1 つは、「遅い」ポインタと「速い」ポインタを使用してリストをたどることです。高速ポインターが最後に到達すると完了です。スロー ポインタを使用して結果を拡大します。このような:

(define (half list)
  (let halving ((rslt '()) (slow list) (fast list))
    (if (or (null? fast) (null? (cdr fast)))
        (reverse rslt)
        (halving (cons (car slow) rslt)
                 (cdr slow)
                 (cdr (cdr fast))))))
于 2013-06-27T21:45:52.357 に答える
0

それにアプローチする別の方法は、特定のインデックスでリストを分割する関数を用意し、次にラッパーを使用して floor(length/2) を計算することです。

(define (cleave_at n a)
  (cond
   ((null? a) '())
   ((zero? n) (list '() a))
   (#t 
    ((lambda (x)
      (cons (cons (car a) (car x)) (cdr x)))
     (cleave_at (- n 1) (cdr a))))))

(define (first-half a)
  (car (cleave_at (floor (/ (length a) 2)) a)))
于 2013-07-26T21:57:52.633 に答える