2016-09-24 8 views
0

私はこの関数を実装するのに時間を割いていましたが、もっと手助けできるリソースを見つけることができませんでした。スキーマでAppend関数を使用して数値ソートを実装する

私は数値ソートを実装しようとしていますが、値を昇順で並べ替えます。

私の現在の実装は次のようになります。私は、論理的に物事がどのように行われている手法や理解に非常にラフな時間を過ごしてきた

(define num-sort 
(lambda (ls) 
    (if(null? (cdr ls)) 
     ls 
    (if(< (car ls) (cadr ls)) 
     (append (car ls) (num-sort(cdr ls))) 
    (if(> (car ls) (cadr ls)) 
     (append (num-sort(cdr ls)) (car ls)) 
     (num-sort(cdr ls)) 
    ))))) 

私の「追加」機能は、私が前にこれに実現される機能であり、意図したとおりに動作するように表示されます。私は比較するとき

(define append 
    (lambda (ls1 ls2) 
    (if (null? ls1) 
    ls2 
    (if (pair? ls1) 
    (cons (car ls1) (append (cdr ls1) ls2)) 
     (cons ls1 ls2))))) 

私はその中で、ここでは、再帰に問題があることを理解します2つの要素を持ち、別の再帰呼び出しを行うことにしましたが、これは完全に注文を完全に壊してしまいますが、これを修正する方法がわかりません。

私が考えているのは、各要素を隣接する要素と比較してリストをアセンブルすることです。通常、私は配列と変数のインデックスを別の言語で格納してアクセスすることでこれを試みますが、この中でどのように正しくソートするかについて私の頭を覆すことはできません。

+0

(https://en.wikipedia.org/wiki/Sorting_algorithm)[ソートアルゴリズム]あなたはどちらを実装しようとしていますか? – Renzo

+0

挿入ソート以外は何もありません。バブルを実装する方法やこれをソートする方法がわかりません。 –

+0

次に、この[ページ](http://www.cs.odu.edu/~zeil/cs355/Handouts/schemedoc/schemedoc/node16.html)にあるQuicksortの実装を使用することができます。 – Renzo

答えて

0

あなたはソートの選択を実装したい場合は、ここではスタートだ:

(define (num-sort ls) 
    (if (null? ls) 
     ls 
     (num-sort-helper (car ls) '() (cdr ls)))) 


(define (num-sort-helper min-so-far checked unchecked) 
    # min-so-far is no bigger than anything in checked 
    # nothing in unchecked has been looked at 

    # return a list made up of min-so-far and the elements of 
    # checked and unchecked such that that first element returned 
    # is no bigger than anything else in that list 

    # For example, (num-sort-helper 5 '(6 9 7) '(8 2 3)) returns 
    # a list of all 7 numbers with 2 at the beginning 

    (cond ((null? unchecked) ???)    # nothing is bigger than min-so-far 
     ((<= min-so-far (car unchecked)) ???) # min-so-far is still the "winner" 
     (else ???)))       # (car unchecked) is now the "winner" 
関連する問題