この F# seq 式は末尾再帰のように見えますが、スタック オーバーフロー例外が発生しています (末尾呼び出しが有効になっている場合)。私が欠けているものを誰か知っていますか?
let buildSecondLevelExpressions expressions =
let initialState = vector expressions |> randomize
let rec allSeq state = seq {
for partial in state do
if count partial = 1
then yield Seq.head partial
if count partial > 1 || (count partial = 1 && depth (Seq.head partial) <= MAX_DEPTH) then
let allUns = partial
|> pick false 1
|> Seq.collect (fun (el, rr) -> (createExpUnaries el |> Seq.map (fun bn -> add rr bn)))
let allBins = partial // Careful: this case alone produces result recursivley only if |numbers| is even (rightly!).
|> pick false 2
|> Seq.collect (fun (el, rr) -> (createExpBinaries el |> Seq.map (fun bn -> add rr bn)))
yield! allSeq (interleave allBins allUns)
}
allSeq initialState
ご参考までに、重要ではありませんが、pick
はシーケンス内の要素の組み合わせを生成するために使用されinterleave
、2 つのシーケンスから要素をインターリーブします。vector
のコンストラクタですResizeArray
。