2017-04-17 17 views
0

私はSchemeと関数型プログラミングを使い慣れていますので、やさしくしてください。 私はリストを取り機能とピボットを実装し、以下の2つのリストを含むリストを返すようにしようとしている:スキーム:ピボット要素を並べ替える

以下またはピボットに等しいすべての要素の一つ、

と1をピボットよりも大きいすべての要素に対して

だから私は、次のコード(EDITED(& WORKING)CODE - PROBLEM解決しよう)を書いた:

define helper (lambda (lst pivot) 
      (define lst1 null) 
      (define lst2 null) 
      (define my-split (lambda (lst pivot lst1 lst2) 
           (if (null? lst) 
            (list lst1 lst2) 
            (if (<= (car lst) pivot) 
             (my-split (cdr lst) pivot (cons (car lst) lst1) lst2)           
             (my-split (cdr lst) pivot lst1 (cons (car lst) lst2))))))         
       (my-split lst pivot lst1 lst2))) 

私の現在の問題はlst1lst2はので、私は問題を推測実行の最後にnullであるということです行番号(cons (car lst) lst1) & (cons (car lst) lst2)))です。

私はいくつかの複雑なコマンドを使用するいくつかの実装を見ましたが、私は使用できません(はい、宿題です)。

独自のコードを提供するのではなく、コードを修正する方法をご提案ください。

ありがとう

答えて

1

主な問題である2つの行を正しく特定しました。 consは、新しいリストを作成して返しますが、変数lst1lst2を変更しようとしています。これを行う正しい方法は(set! lst1 (cons (car lst) lst1))(set! lst2 (cons (car lst) lst2))です。しかし、良い関数型プログラミングスタイルは突然変異を避けることを覚えておいてください。この場合、これを行うには、メインリストを再帰的に実行するときに引数として2つのサブリストを渡し、最後に到達したときにそれらを戻すことが有効な方法です。

+0

ありがとうございます。私が言及したように、Imは 'set! 'を使用できません。入力パラメータに' lst1'と 'lst2'を追加して引数として渡しましたが、結果は同じです私の編集を参照してください)。あなたが提供しているもののコードサンプルを提供できますか? – Noam

+1

@Noamあなたはほとんどそこにいます。 '(list lst1 lst2)'を最後の行から最初の 'if'式の最初の部分に移動します(' null'を置き換える)。 –

+0

ありがとうございました。 – Noam

1

Javaのstr.concat("hey")のような表現のように、str(cons 1 lst1)の場合、何も変更されません。lst1は変更されません。新しい値を返します。関数の大半はデッドコードで構成されています。実際に関数型プログラミングを学びたい場合は、バインドやオブジェクトを変更することはできません。あなたはこのような何かをする必要が

(define (count-odds lst) 
    (define (helper lst odds) 
    (cond ((null? lst) 
      odds) 
      ((odd? (car lst)) 
      (helper (cdr lst) (+ 1 odds))) 
      (else 
      (helper (cdr lst) odds))))  
    (helper lst 0)) 

(count-odds '(1 2 3)) 
; ==> 2 

我々はoddsを変更することはありませんが、私たちは次の再帰に送られるものを更新します。 Schemeはテールコールの消去を持っているので、これは実際の突然変異なしでwhileループの変数を更新するのと同じです。

+0

説明してくれてありがとう、私はあなたの例を理解するが、私は自分の問題にそれを適用する方法がわからない、私は私のコードを編集して、あなたが言ったことをしようとしましたが、結果は同じです。何か案は? – Noam

+0

'split-at'が' lst1'を返し、 'lst2'がヌル値で再び終わるとき。結果として 'split-at'からの結果が必要なので、これを削除したいでしょう。ヌルを返すのではなく、 'lst'の最後にヒットしたときに、' lst1'と 'lst2'で何かしたいかもしれません。また、プロシージャーで定義されている 'lst1'と' lst2'には、パラメーターと関係のない** nothing **があります。彼らはちょうど同じ名前を持つことが起こります。 – Sylwester

関連する問題