2011-07-29 13 views
0

私はなぜlist-refが正しいパラメータを取得できないのですか?

#lang racket 

(define (quick-sort xs) 
    (let* ([p (list-ref xs 0)] 
     [tail (list-tail xs 1)] 
     [less (filter (lambda (x) (< x p)) tail)] 
     [greater (filter (lambda (x) (>= x p)) tail)]) 
    (append (quick-sort less) (list p) (quick-sort greater)))) 

(ラケット)方式でクイックソートを書いたしかし、私はそれをしようとしたとき、私はこのエラーを得た:

> (quick-sort (list 99 2 9922)) 
list-ref: index 0 too large for list: '() 

私はかなり理解していないので、私はスキームに新たなんです

ありがとう:なぜリスト-refが正しい入力'(99 2 9922)

編集を取得することはできません。私はそれを仕事にしました。

#lang racket 

(define (quick-sort xs) 
    (let* ([p (first xs)] 
     [tail (rest xs)] 
     [less (filter (lambda (x) (< x p)) tail)] 
     [greater (filter (lambda (x) (>= x p)) tail)]) 
    (if (equal? (length xs) 1) 
     xs 
     (append (quick-sort less) (list p) (quick-sort greater))))) 
+1

新しいコードでは、 '(equal?(length xs)1)'はすべての入力に対してテストされ、常にxsの全長(線形演算)を計算します。長さが何であるか気にしないので、1以外の場合、 '(and(not?null?xs))(null?(cdr xs)))'のような定数時間テストを使うことができます。 (リストは空ではなく、最初の要素*の後の部分が*空であると主張しますが後者は明らかに長さ1を意味しますが、リストが空でなければエラーが発生しますしたがって、最初の条件。) – Carlo

答えて

3

再帰アルゴリズムを設計する際には、二つのことが重要である:あなたの終了条件とあなたの再帰的ステップ、および終了条件はありません。

(append (quick-sort (list 2)) (list 99) (quick-sort (list 9922))) 
を最初 quick-sort呼び出しが順番に (quick-sort '())を呼び出します: quick-sortのあなたの最初の実行時には、あなたが電話するよ:あなたのコードが何をしているかトレースします。あなたのコードは空のリストを非常に上手く処理しません。配列の最初の要素を常に最初に参照しようとします。

空のリストを正常に処理するロジックを追加します。

また、リストの最初と残りの要素を取得するためにfirstrestを使用すると、はるかに実用的であると考えられます。

3

入力リストが空の場合、コードには基本ケースがありません。その場合、list-refはそのエラーで失敗します。

ところで、(list-ref l 0)のより良い名前は(first l)であり、同様に(list-tail l 1)(rest l)と表示されます。

は(もcarcdrありますが、あなたが初心者なら、あなたが今のためにそれらを無視することができます。)

0

あなたはおそらくこれを知っていますが、ラケットにはsort機能も組み込まれています。

関連する問題