0

ダイクストラの最短アルゴリズムであるスキーム プログラムを作成しようとしています。エッジをリラックスさせているときの手順で、エラーが発生します

; 不正な特殊フォーム: (let (...) ())

私の手順のコードは、

(define relax-over-edge 
   (lambda (distlist edge min-pair)
     ( if (null? distlist)
       ()
       (if (equal? (cadr edge) (caar distlist)) 
            (if (> (cdar distlist) (+(cdr min-pair) (cddr edge)))
                (let (((cdar distlist) (+ (cdr min-pair) (cddr edge)) )) ())
                ()
            )
            (relax-over-edge (cdr distlist) edge min-pair)
        )
     )  
   )
)

既にありがとうございます。

4

2 に答える 2

5

もちろん、これは不正な形式のlet:

(let (((cdar distlist)
       (+ (cdr min-pair) (cddr edge)))) 
  '())

何をしようとしていたのですか?(+ (cdr min-pair) (cddr edge))位置の要素に式を割り当て(cdar distlist)ますか? それは間違いなくSchemeでリストが機能する方法ではありません(少なくとも不変リストではそうではありません)。そのような位置に値を割り当てることはできません。さらに、式のバインディングの左側で宣言できるのは変数のみであり、let他の式 (コード内など) では宣言できません。

vector (指定された位置の要素のインプレース変更をサポートする) を使用する、使用しているスキーム インタープリターのドキュメントをチェックして、ミュータブルについて何と言っているのかを確認するために、アルゴリズムを再考する必要があります。ペアとリスト。

于 2012-05-12T23:34:26.183 に答える
1

フォームの本文letが just()であるため、エラーが発生しています。これは、評価できる有効な式ではありません。ガイルマニュアルの引用:

構文: (let bindings body) BINDINGS の形式は次のとおりです。

      ((VARIABLE1 INIT1) ...)

 that is zero or more two-element lists of a variable and an
 arbitrary expression each.  All VARIABLE names must be distinct.

...

    * The expressions in BODY are evaluated in order, and the value
      of the last expression is returned as the value of the `let'
      expression.
于 2012-05-13T02:55:33.153 に答える