私はここで小さな問題に遭遇しました。私はTortoise and Hare cycle detection algorithmと書いた。Fでの(擬似)巡回判別集合の作成#
type Node =
| DataNode of int * Node
| LastNode of int
let next node =
match node with
|DataNode(_,n) -> n
|LastNode(_) -> failwith "Error"
let findCycle(first) =
try
let rec fc slow fast =
match (slow,fast) with
| LastNode(a),LastNode(b) when a=b -> true
| DataNode(_,a), DataNode(_,b) when a=b -> true
| _ -> fc (next slow) (next <| next fast)
fc first <| next first
with
| _ -> false
これは、それが偽示し
let first = DataNode(1, DataNode(2, DataNode(3, DataNode(4, LastNode(5)))))
findCycle(first)
のための素晴らしい取り組んでいます。右。今サイクルでテストしようとすると、を作成することができませんループ!
let first = DataNode(1, DataNode(2, DataNode(3, DataNode(4, first))))
しかし、私はその種のものが必要:
明らかにこれは動作しないだろう!どのように作成するか教えていただけますか?
'findCycle(DataNode(1、DataNode(1、LastNode 2)))'は本当に 'true'に評価する必要がありますか? – kvb
それを指摘していただきありがとうございます。次のノードが同じかどうかをチェックするように変更しました。 –
構造平等ではなく参照平等を使用しますか? –