从递归到非递归
递归确实是一种优雅强大的技术, 但是好多代码库都偏爱使用迭代,即使使用递归, 也都往往对递归调用的最大栈深度提前做预估或限制等。可能考虑递归性能一般低于迭代。有些问题,我们可能先是使用递归解决, 然后再转变成对应的迭代版本, 练习递归到迭代的转换,也有助于我们理解问题的递归结构。 树是典型的递归定义数据结构, 对应的操作也是递归的实现,如二叉树的遍历: type node struct { link [2]*node data rune } func preOrder(root *node) { if root != nil { fmt.Printf("%c ", root.data) preOrder(root.link[0]) //left subtree preOrder(root.link[1]) //right subtree } } func inOrder(root *node) { if root != nil { inOrder(root.link[0]) //left subtree fmt.Printf("%c ", root.data) inOrder(root.link[1]) //right subtree } } func postOrder(root *node) { if root != nil { postOrder(root.link[0])