Recursion 带树遍历的堆栈溢出

Recursion 带树遍历的堆栈溢出,recursion,tree,functional-programming,ocaml,Recursion,Tree,Functional Programming,Ocaml,我的树定义如下:(只是为了更好地理解,我的数据类型要复杂得多。) 我需要找到一个0和1的序列,如下所示: 1 | 0 0 \ / 1 | 1 输出将是根以及0和1的序列。下面是我的代码:(我假设只有当值为0的树的节点(树列表)只有一个元素时,序列才会出现,但我需要更改它,因为这不是必需的。) let rec getSequence tree= 将tree.value与 | 0 -> 如果(List.length tree.nodes)=1,则 让n

我的树定义如下:(只是为了更好地理解,我的数据类型要复杂得多。)

我需要找到一个0和1的序列,如下所示:

    1  
    |
  0 0
  \ /
   1
   |
   1
输出将是根以及0和1的序列。下面是我的代码:(我假设只有当值为0的树的节点(树列表)只有一个元素时,序列才会出现,但我需要更改它,因为这不是必需的。)

let rec getSequence tree=
将tree.value与
| 0 ->
如果(List.length tree.nodes)=1,则
让nextTree=List.hd tree.nodes进入
将nextTree.value与匹配
| 1 -> 
nextTree.nodes(获取序列t)nextTree.nodes)
else List.concat(List.map(fun t->getSequence t)树节点)
|1->List.concat(List.map(fun t->getSequence t)树节点)
由于某种原因,当我执行代码时,会引发异常堆栈溢出。有人能帮我吗?

让nextTree=List.hd tree.nodes进入
let nextTree = List.hd tree.nodes in
nextTree.nodes <- [];

nextTree.nodes我尝试了它,但您的示例输入没有异常。我猜您只会得到一个更大(尤其是更深)输入的堆栈溢出异常

以下是一些选项:

  • 增加堆栈大小:

    导出OCAMLRUNPARAM='l=64M'#或其他任何内容

  • 将函数重写为尾部递归,这样就不需要太多堆栈空间。可以通过将状态作为参数传递来实现这一点

  • 其他建议:

    • 使用模式匹配而不是
      List.length
      List.hd
    • 如果使用2,也可以避免使用
      List.concat

    您确定粘贴了正确的代码段吗?正如你所说的,你的代码没有进行类型检查。我看不到代码中有任何明显的缺陷。也许你可以展示导致问题的输入。我既不懂图表(你能给出输入和输出的例子吗?),也不懂代码(为什么会发生变异?)。您是否可能使用变异(一棵通过其子树指向自身的树)创建循环值?在循环值上运行任何非尾部递归过程都是彻底破坏堆栈的可靠方法。
    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)
    
    let nextTree = List.hd tree.nodes in
    nextTree.nodes <- [];
    
    tree.nodes<-(List.tl tree.nodes);