0

私のツリーは以下のように定義されています: (これは理解を深めるためのもので、私のデータ型ははるかに複雑です。)

  type tree = {
    mutable value : int;
    mutable nodes : tree list
  }

以下に示すように、0 と 1 のシーケンスを見つける必要があります。

    1  
    |
  0 0
  \ /
   1
   |
   1

出力はルートと 0 と 1 のシーケンスになります。これを行うコードは次のとおりです。しかし、それは必要ないので変更する必要があります。)

let rec getSequence tree = 
  match tree.value with
  | 0 ->
if (List.length tree.nodes) = 1 then
  let nextTree = List.hd tree.nodes in
  match nextTree.value with
  | 1 -> 
    nextTree.nodes <- [];
    tree.nodes <- [nextTree];
    [tree]
  | 0 -> List.concat (List.map (fun t -> getSequence t) nextTree.nodes)
else List.concat (List.map (fun t -> getSequence t) tree.nodes)
  | 1 -> List.concat (List.map (fun t -> getSequence t) tree.nodes)

何らかの理由でコードを実行すると、例外 Stack_overflow が発生します。誰でも私を助けることができますか?

4

2 に答える 2

0

試してみましたが、サンプル入力で例外はありません。はるかに大きな(特に深い)入力でのみ Stack_overflow 例外が発生すると思います。

以下にいくつかのオプションを示します。

  1. スタック サイズを増やします。

    export OCAMLRUNPARAM='l=64M' # など

  2. 関数を末尾再帰に書き換えて、スタック スペースをあまり必要としないようにします。状態を引数として渡すことでそれを行うことができます。

その他の提案:

  • List.lengthとの代わりにパターン マッチングを使用しList.hdます。
  • 2.で行けば、も回避List.concatできます。
于 2013-10-04T21:08:08.670 に答える