無制限の数の引数を取る関数を作成し、それらをリストとして扱うことができるのが好きです。二分木を作成するときに便利で、現在、最近傍アルゴリズムのバリエーションとして使用しています。しかし、私の方法は本当にひどいものです。不適切なリスト (不適切で縮退している可能性があります) を反復処理する方法が思いつかないので、さまざまなリスト関数を使用して、不適切なリストを強制的にリスト形式にしようとしました。
これは、マップノード間の違いを判断するための単純な関数での私の最善の試みです(機能しますが、なぜ機能するのかわかりません):
(define distance-between
(lambda xs
(let ([input-list (list* xs null)])
(letrec
([f (lambda (xs acc)
(if (null? (cdr xs))
acc
(f (cdr xs)
(+ (abs (- (map-node-x (car xs))
(map-node-x (cadr xs))))
(abs (- (map-node-y (car xs))
(map-node-y (cadr xs))))
acc))))])
(f (car input-list) 0)))))
ご覧のとおり、これは醜い解決策であり、私には魔法のように見えるもののいくつかが含まれています.不適切なリストをリストに含めると、リスト形式に強制されるのはなぜですか*? (注: この文は誤解を招きます。これは発生しません)。
私はむしろきれいな解決策があり、魔法はありません。誰でも助けることができますか?
たとえば、典型的な入力は次のようになります。
(distance-between (map-node 1 2) (map-node 2 3) (map-node 3 4))
期待される結果で:
4
(map-node (a) と mn (b) の間の距離 2、さらに map-node (b) と map-node (c) の間の距離 2)。
あるいは、次のように単純に入力することもできます:
(distance-between (map-node 1 2) (map-node 2 2))
そして次の答えを得る:
1
(let ([input-list...])...) ステートメントを使用せずに生の入力でこれを試みた場合、(? 実際にはなぜこの質問に応答したのかわかりません) としてエラーが発生します。
機能は期待どおりに機能します。