与打字稿递归有关的问题

时间:2020-08-13 07:46:23

标签: javascript typescript recursion ecmascript-6

遇到问题时,我试图解决BST问题。

Converter

上面的函数应该返回一个数组,该数组包含因顺序遍历而排序的元素。但是,它的行为不符合预期。

要解决该问题,我所做的是代替对数组进行变异,而不是更改数组,而是更改了递归函数以返回新的数组eveytime。在这种情况下,它似乎可以按预期工作,即对最终返回的数组进行了排序。

为什么会这样?这与Javascript的异步行为有关吗?如果是这样,正确的解释是什么?

1 个答案:

答案 0 :(得分:0)

这是一个有效的示例。当您仅更改arr时,可以发布inorder()并将其打印出来。否则,您只需将另一个函数包装在inorder之上,并在函数末尾返回arr

let arr: number[] = []
interface BST{
  left:BST | null,
  right:BST | null,
  value:number
}
function inorder(tree: BST | null): void {
  if(tree !== null) {
      inorder(tree.left)
      arr.push(tree.value)
      inorder(tree.right)
  }
}

const bstData: BST={
  left:{
    left:{
      left:null,
      right:null,
      value:3
    },
    right:{
      left:null,
      right:null,
      value:7
    },
    value:5
  },
  right:{
    left:{
      left:null,
      right:null,
      value:15
    },
    right:{
      left:null,
    right:null,
    value:25
    },
    value:20
  },
  value:10
}
inorder(bstData)
console.log(arr)

编辑1:创建包装函数

function inorderWrapper(tree: BST | null) {
    let arr: number[] = []
    function inorder(tree: BST | null): void {
        if (tree !== null) {
            inorder(tree.left)
            arr.push(tree.value)
            inorder(tree.right)
        }
    }
    inorder(tree)
    return arr;
}

inorderWrapper(data)