当前位置:   article > 正文

回溯算法,递归和迭代_回溯法的递归和迭代过程

回溯法的递归和迭代过程

        递归在算法中很常见,比如下面两个例子。

  1. A-program
  2. // 二叉树中序递归版本
  3. visit(root){
  4. if root==null; return
  5. visit(root.left) // 左树
  6. print(root) //
  7. visit(root.right) // 右树
  8. }

       sum(n)求和:

  1. B-program
  2. // 递归版本求和
  3. f(n){
  4. if n=1 ;return 1
  5. return n+f(n-1)
  6. }

       在算法设计中,递归由于调用栈过深,资源得不到释放,性能较差,往往需要转换为迭代版本,理论上,可以证明,迭代和递归是可以相互转换的。

        递归改迭代,是回溯算法的具体应用。在迭代版本中,我们很大可能会用到栈的数据结构,来以此模拟函数的调用过程。在迭代中,需要我们显示存储当前节点和路径。B是单路递归(尾递归),A是多路递归,B是A的一个特例。

        A迭代版本:

  1. visit(root){
  2. stack,root // 存储路径和当前节点
  3. // 有节点没有访问到或者回溯到
  4. while(stack.size()>0 || root !=null){
  5. while(root!=null){
  6. stack.push(root)
  7. root.left
  8. }
  9. // 没有左节点后就开始回溯
  10. cur = stack.pop()
  11. print(cur)
  12. root = cur.right
  13. }
  14. }

          B迭代版本:

其实,最能体现回溯算法的威力例子就是树的遍历:preOrder,inOrder,postOrder三种遍历方法。

##回溯算法模板

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/744867
推荐阅读
相关标签
  

闽ICP备14008679号