2011-02-24 8 views
0

ねえ、私は終わりまで私をイライラさせている宿題の質問があります!最低限のインデックスを作成して、空でないリストを取得し、リスト内の最も小さい番号のインデックスを返します。 (car ls)= 0のインデックス、(car(cdr ls))= 1のインデックスなど。リスト内の数字の位置を探す

現在位置、最小位置、最小値、およびリストを記録するヘルパーを作成する必要があります。これまでのところ、基本的なアルゴリズムを示すこのプログラム(ロードしていない)があります。しかし、すべてを追跡してchezスキームコードに入れるのは苦労しています。

(define index-helper 
    (lambda (ls current-position least-position least-value) 
    (if (> (car ls) least-value) 
     (add1 (car ls (cdr ls (add1 current-position)))) 
     (car ls (cdr ls (add1 current-position)))))) 

;trace 
;ls: (4231) c-pos: 0 least-value: 5 least-pos: 0 
;ls: (231) c-pos: 1 least-value: 4 least-pos: 1 
;ls: (31) c-pos 2 least-value: 2 least-pos: 2 
;ls: 1 c-pos: 3 l-v: 2 l-pos: 2 
;ls '() c-pos: 4 l-v: 1 l-pos: 4 
;*least-position = current-position 

私はすでにこれをGoogleで検索し、Pythonで同様の質問を見つけましたが、私はプログラミングに新たなんだので、私は、コードを理解していません。 :P 誰かが私にヒントを与えることができれば、本当に感謝しています!

+0

どのように?私はインストラクターが自分の宿題がこのようにGoogleに現れることを望んでいないと思う。 – erjiang

+1

@erjiang:IRC convosもログに記録されていませんか? ;-) –

+0

@ヤシール:ハァッ、ええ、しかし、SOはそんなにSEOされました。 – erjiang

答えて

1

2つの機能が必要です。最初の関数は、最小の要素を見つけます。x。 2番目の関数は、リスト内の要素xのインデックスを検索します。

のような何か:

(define (find-least xs) 
    (foldl (lambda (e acc) (min e acc)) (car xs) xs)) 

(define (elem-index x xs) 
    (define (elem-index-find x xs ind) 
    (cond 
     ((empty? xs) ind) 
     ((eq? x (car xs)) 
     ind) 
     (else (elem-index-find x (cdr xs) (+ ind 1))))) 
    (if (empty? xs) 
     (error "empty list") 
     (elem-index-find x xs 0))) 

(define (index-of-least xs) 
    (let ((least (find-least xs))) 
    (elem-index least xs))) 

テスト:

(define (index-of-least-1-pass xs) 
    (define (index-do least ind-least ind xs) 
    (cond 
     ((empty? xs) ind-least) 
     ((< (car xs) least) 
     (index-do (car xs) (+ ind 1) (+ ind 1) (cdr xs))) 
     (else 
     (index-do least ind-least (+ ind 1) (cdr xs))))) 
    (index-do (car xs) 0 0 (cdr xs))) 

テスト:

> (index-of-least-1-pass (list 5 8 4 9 1 3 7 2)) 
4 
> (index-of-least (list 5 8 4 9 1 3 7 2)) 
4 

あるいは、1回のパスでindex-doヘルパー関数では、最初に中間リストが空であるかどうかをチェックします。これは、リストの要素が1つだけで、そのインデックスを返すときの基本ケースです。

次の条件では、中間リストの次の要素が現在のleastの値より大きいかどうかを確認し、そうであれば、新しい値leastとそのインデックスを持つヘルパーを呼び出します。次の要素がleastより大きくない場合

最後の条件は、選択され、そしていかなる要素には存在しなくなるまで、それを除去leastind-least、ヘッド素子との中間リストの同じ値を持つヘルパー関数を呼び出しリストに要素がない場合は、基本ケースに近づいた。

1

を聞かせて命名のための良い例:代わりに#schemeに尋ねる程度

(define (index-of-least xs) 
    (let loop ((i 0) (p 0) (x (car xs)) (xs (cdr xs))) 
    (cond ((null? xs) p) 
      ((< (car xs) x) (loop (+ i 1) (+ i 1) (car xs) (cdr xs))) 
      (else (loop (+ i 1) p x (cdr xs)))))) 

(index-of-least (list 5 8 4 9 1 3 7 2)) => 4 
関連する問題