美文网首页
371. 用递归打印数字

371. 用递归打印数字

作者: 6默默Welsh | 来源:发表于2018-02-01 20:36 被阅读9次

描述

用递归的方法找到从1到最大的N位整数。

注意事项

用下面这种方式去递归其实很容易:

recursion(i) {
    if i > largest number:
        return
    results.add(i)
    recursion(i + 1)
}

但是这种方式会耗费很多的递归空间,导致堆栈溢出。你能够用其他的方式来递归使得递归的深度最多只有 N 层么?

样例

给出 N = 1, 返回[1,2,3,4,5,6,7,8,9].
给出 N = 2, 返回[1,2,3,4,5,6,7,8,9,10,11,...,99].

挑战

用递归完成,而非循环的方式。

代码

public class Solution {
    /**
     * @param n: An integer.
     * return : An array storing 1 to the largest number with n digits.
     */
    public List<Integer> numbersByRecursion(int n) {
        ArrayList<Integer> res = new ArrayList<>();
        // 此处是 n
        num(n, 0, res);
        return res;
    }
    
    public void num(int n, int ans, ArrayList<Integer> res){
        // 递归出口, n = 0 代表已经从高位计算到个位
        if (n == 0) {
            if (ans > 0) {
                res.add(ans);
            }
            return;
        }
        
        int i;
        // 从低位向高位不断计算
        // n 代表数字总共有多少位
        /* nums(n, ans, res)
         * nums(2, 0 ,res) i = 0 -> nums(1, 0, res) 
         *                          nums(0, 0 * 10 + i, res) 时 i = 1 ~ 9,
                                    ans = 1, ans = 2 ...... ans = 9
                           i = 1 -> nums(1, 1, res)
                                    nums(0, 1 * 10 + i, res) 时 i = 1 ~ 9,
                                    ans = 10, 11, 12, 13...... 19
                           i = 2 -> nums(1, 2, res)
                                    nums(0, 2 * 10 + i, res) 时 i = 1 ~ 9,
                                    ans = 20, 21, 22, 23...... 29
                           ......依次类推
                           i = 9 -> nums(1, 9, res)
                                    nums(0, 9 * 10 + i, res) 时 i = 1 ~ 9,
                                    ans = 90, 91, 92, 93...... 99
         */
        for (i = 0; i <= 9; i++){
            num(n - 1, ans * 10 + i, res);
        }
    }
}

相关文章

  • 371. 用递归打印数字

    描述 用递归的方法找到从1到最大的N位整数。 注意事项 用下面这种方式去递归其实很容易: 但是这种方式会耗费很多的...

  • lintcode 371. 用递归打印数字

    难度:中等 1. Description 2. Solution python 3. Reference http...

  • week02斐波那契数列

    1.用循环打印出斐波那契数列。 2.用递归打印出斐波那契对应的数字。 用循环制作 用递归制作 第一版:重复计算版 ...

  • 递归

    递归方式实现打印一个整数的每一位 写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,例...

  • 371. Sum of Two Integers

    371. Sum of Two Integers【思路】: 位运算 [leetcode] 371. Sum of ...

  • 数组

    1.递归求和: 2.for循环打印二维数组: 3.用递归判断数组是否递增: 结束条件:数组长度为1,返回true;...

  • FizzBuzz

    题目: 写一个程序打印1到100这些数字。但是遇到数字为3的倍数的时候,打印“Fizz”替代数字,5的倍数用“Bu...

  • 数据结构与算法-递归和分治思想

    递归效率地下,不要万不得已,不要使用递归。用迭代就可以解决问题。 斐波那契数列的递归实现 比如打印出前40个月,每...

  • Leetcode PHP题解--D84 371. Sum of

    D84 371. Sum of Two Integers 题目链接 371. Sum of Two Integer...

  • 基础练习:循环语句和条件语句的组合使用

    一、需求 写一个程序打印1到100这些数字。但是遇到数字为3的倍数的时候,打印“Fizz”替代数字,5的倍数用“B...

网友评论

      本文标题:371. 用递归打印数字

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