1

このスキームコードがわかりません。助けてください。Compute-frequenciesは、looking-for-listとpool-listの2つの別々のリストを取ります。これは、looking-for-listのすべてがpool-listにある回数を示すリストを返すことになっています。プールリストを通過した後の再帰呼び出しに関係している可能性が最も高いのは、ほんの少しのエラーです。

(define (compute-frequencies looking-for-list pool-list) 
  (define (helper looking-for-list pool-list current-frequency frequency-list)  ; keeps track of finished list and iterates through both lists
    (if (null? looking-for-list) (reverse frequency-list)                       ; finding the number of times data in looking-for-list are in pool-list
    (if (null? pool-list)
        (helper (cdr looking-for-list) pool-list 0 (cons current-frequency frequency-list))
        (if (equal? (car looking-for-list) (car pool-list))
        (helper looking-for-list (cdr pool-list) (+ 1 current-frequency) frequency-list)
        (helper looking-for-list (cdr pool-list) current-frequency frequency-list)))))

 (helper looking-for-list pool-list 0 '() ))
4

1 に答える 1

2

コードを読んでよければ、アルゴリズム自体は完全に問題ないようです。問題ははるかに簡単です。

のすべての要素をチェックしたら、元の状態に復元するpool-list最初の要素のコードを確認します。これを行うには、としてを呼び出します。あなたはほぼ間違いなく引数で定義されたものを意味しますが、Schemeはの引数で1つを取ります。これは、の1つをシャドウするためです。これは、最初の反復の後、他のすべての頻度が0になることを意味します。looking-for-listpool-listhelperpool-listpool-listcompute-frequencyhelpercompute-frequencypool-list'()

これを解決するには、名前を変更します。将来的には、Scheme変数がより広い範囲の変数をシャドウする可能性があり、シャドウすることを覚えておいてください。また、condネストされたifステートメントの代わりに使用してみてください。スキームではるかに読みやすい(それは私がこの問題を見つけた方法です)

于 2012-11-13T05:20:09.983 に答える