美文网首页
如何将递归转换为循环

如何将递归转换为循环

作者: 賈小強 | 来源:发表于2018-04-07 16:47 被阅读49次

简书 賈小強
转载请注明原创出处,谢谢!

动机

1,递归效率没有循环高,有额外的方法调用开销
2,堆栈溢出(stackoverflow)
3,递归有时挺难理解(不过很多算法用递归最容易实现)

直接法

1, 首先找到递归的结束条件,并且每次递归调用肯定是逼近结束条件(Base Case)
2, 实现一个相同结束条件的循环,每次循环逼近结束条件

public class CountDown {
    public void countDown(int n) {
        if(n == 0) return;

        System.out.println(n + "...");
        waitASecond();
        countDown(n-1);
    }

    public void waitASecond() {
        try {
            Thread.sleep(1000);
        }
        catch (InterruptedException ignore) {
        }
    }

    public static void main(String[] args) {
        CountDown c = new CountDown();
        c.countDown(10);
    }
}

重构后

public class CountDown {
    public void countDown(int n) {
        while(n > 0) {
            System.out.println(n + "...");
            waitASecond ();
            n -= 1;
        }

    }

    public void waitASecond() {
        try {
            Thread.sleep(1000);
        }
        catch (InterruptedException ignore) {
        }
    }

    public static void main(String[] args) {
        CountDown c = new CountDown();
        c.countDown(10);
    }

显式栈法

通过显示定义的栈模拟系统方法栈,将每个方法的局部变量存入自定义栈中,然后再循环

package com.lab0.test2;

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

    public static void main(String[] args) {
        System.out.println(factorial(3));
    }
}

转换后

package com.lab0.test2;

import com.lab1.test1.LinkedStack;

public class TestFactorial2 {
    public static void main(String[] args) {
        LinkedStack<Integer> stack = new LinkedStack<>();
        for (int i = 3; i > 0; i--) {
            stack.push(i);
        }
        int result = 1;
        for (int v : stack) {
            result *= v;
        }
        System.out.println(result);
    }
}

Happy learning !!

相关文章

  • 如何将递归转换为循环

    简书 賈小強转载请注明原创出处,谢谢! 动机 1,递归效率没有循环高,有额外的方法调用开销2,堆栈溢出(stack...

  • EXCEL中数字大小写的转换

    一、问题一: (一)如何将12345转换为一二三四五(有单位)? (二)如何将12345转换为壹贰叁肆伍(有单位)...

  • 递归入门

    1.递归求前n项和 所有循环都可以转化为递归,而递归大多数可以转换为循环 2.递归求最大值 数组第一个下标与最后一...

  • Java递归原来如此简单

    递归思想 把大问题转换为小问题(问题简单化),有明显的结束条件(不会无限循环) 递归例子 层级路径设置 分析 当我...

  • JavaScript计算斐波那契数列

    很多语言都提供可尾递归优化,能将尾递归替换为循环方式调用,可以提高计算速度并避免堆栈溢出。但是javascript...

  • 算法之递归、栈

    递归是很多算法都使用的一种编程方法。 如何将问题分成基线条件和递归条件。 第一种方法使用的是循环 —函数调用自己 ...

  • 领扣算法12:整数转换为罗马数字

    题目描述: 递归实现: 循环实现: 递归与循环的比较:

  • 递归与循环

    理论上,任何循环都可以重写为递归形式。有些语言没有循环语句,只能使用递归。 循环改递归 改为递归的关键是发现逻辑“...

  • Unity 热更新 之 如何使用AST转换 C# -> Lua

    本文转自Unity Connect博主 郡墙 本篇主要论述 如何将 C# 代码自动转换为 Lua 代码的解决方案...

  • 递归与循环

    一.递归与循环 递归,说白了就是自己调用自己。理论上,任何的循环都可以重写为递归形式,所有的递归也可以被表述成循环...

网友评论

      本文标题:如何将递归转换为循环

      本文链接:https://www.haomeiwen.com/subject/otjyhftx.html