递归算法转换成非递归算法

         这周,一个同事在开发这样一个功能:把java对象转换成JSON格式的字符串,我知道有开源的jar包,但是他说那个不能处理他目前的需要,所以需要开发一套转换方法。看了他画的流程图,实在看不懂,就给他提了一些建议,重新画了流程图,并采用递归的方式来实现。并另外给他提了一个建议,看看能否把递归方法用非递归的方式来实现。下面给出一个简单的列子,作为递归算法使用非递归算法来实现的一个思路。

       使用java语言实现的求一个整数的阶乘:

     1、递归算法求阶乘

      static int factorial(int n){
          if(n>1){
              return n*factorial(n -1);
           } else if(n==1){
            return 1;
          }
            return 0;
      }


     2、非递归算法求阶乘
         static int factorial2(int n){
                  Stack<Integer> st = new Stack<Integer>();
                  st.push(n);
                  int temp;
                  int total = 1;
                 while((temp = st.peek())!= 1) {
                        total *= temp;
                        st.pop();
                         st.push(temp -1);
               }
                   return total;
          }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用递归算法来计算二叉树的深度。具体实现方法如下: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def maxDepth(root: TreeNode) -> int: if not root: return 0 left_depth = maxDepth(root.left) right_depth = maxDepth(root.right) return max(left_depth, right_depth) + 1 ``` 其中,如果当前节点为空,则返回0;否则,分别递归计算左子树和右子树的深度,并取其中较大值加1作为当前节点的深度。 如果将递归算法转换成非递归算法,可以使用栈来实现。具体实现方法如下: ```python def maxDepth(root: TreeNode) -> int: if not root: return 0 stack = [(1, root)] depth = 0 while stack: cur_depth, node = stack.pop() if node: depth = max(depth, cur_depth) stack.append((cur_depth+1, node.left)) stack.append((cur_depth+1, node.right)) return depth ``` 其中,栈中存放的是二元组,表示节点的深度和节点本身。每次弹出栈顶元素,如果节点不为空,则更新当前深度并计算最大深度,然后将左右子节点压入栈中,并将深度加1。最后返回最大深度即可。 这种方法叫做DFS(深度优先搜索),因为它本质上是一种搜索算法,而且是从根节点开始向下递归,直到叶子节点,然后回溯到前一个节点,再向下搜索其他分支。这种算法的好处是代码简单易懂,而且空间复杂度较低,时间复杂度为O(n),其中n为二叉树的节点数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值