LintCode-用递归打印数字

用递归的方法找到从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].

注意

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

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

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

挑战

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

分析:递归的深度最多只有N层,说明每一位是一次递归,其实也就是先把i-1层的都算出来,再计算第i层的就行

代码:

class Solution {
public:
    /**
     * @param n: An integer.
     * return : An array storing 1 to the largest number with n digits.
     */
    vector<int> numbersByRecursion(int n) {
        // write your code here
        vector<int> ret;
        if(n<=0)
            return ret;
        else if(n==1)
        {
            ret = {1,2,3,4,5,6,7,8,9};
            return ret;
        }
        else
        {
            vector<int> temp = numbersByRecursion(n-1);
            copy(temp.begin(),temp.end(),back_inserter(ret));
            for(int i=1;i<=9;i++)
            {
                ret.push_back(pow(10,n-1)*i);
                for(auto x:temp)
                {
                    ret.push_back(pow(10,n-1)*i+x);
                }
            }
            return ret;
        }
    }
};
时间: 2024-10-11 05:20:17

LintCode-用递归打印数字的相关文章

Shell脚本递归打印指定文件夹中全部文件夹文件

#!/bin/bash #递归打印当前文件夹下的全部文件夹文件. PRINTF() { ls $1 | while read line #一次读取每一行放到line变量中 do [ -d $1/$line ] && { DIR="$1/$line" echo $DIR } DIR1=`dirname $DIR` #求路径. A=`ls -F $DIR1 | grep / | grep "\<$line\>"` #推断line是不是一个文件

【递归】数字三角形 简单dp

[递归]数字三角形 题目描述 对于大多数人来说,“我们是这么的正常,因此也就这么的平庸.”而天才总是与众不同的,所以当邪狼问修罗王:“老大,你蹲在那儿一动不动看了有半个小时了,蚂蚁有那么好看吗?” 修罗王是这样回答的:“我在思索人生的意义,你看这蚂蚁的面前有无数的道路选择,但它不知道选择哪条路可以到达目标,也不知道哪条路上有更多的食物,更不知道现在选择的道路对它以后的影响……” 如图所示,有一个层数为n(n≤1000)的数字三角形.现有一只蚂蚁从顶层开始向下走,每走下一级时,可向左下方向或右下方

Shell脚本递归打印指定目录中所有目录文件

#!/bin/bash #递归打印当前目录下的所有目录文件. PRINTF() { ls $1 | while read line #一次读取每一行放到line变量中 do [ -d $1/$line ] && { DIR="$1/$line" echo $DIR } DIR1=`dirname $DIR` #求路径. A=`ls -F $DIR1 | grep / | grep "\<$line\>"` #判断line是不是一个目录.

UVA1626 - Brackets sequence(区间DP--括号匹配+递归打印)

题目描述: 定义合法的括号序列如下: 1 空序列是一个合法的序列 2 如果S是合法的序列,则(S)和[S]也是合法的序列 3 如果A和B是合法的序列,则AB也是合法的序列 例如:下面的都是合法的括号序列 (),  [],  (()),  ([]),  ()[],  ()[()] 下面的都是非法的括号序列 (,  [,  ),  )(,  ([)],  ([(] 给定一个由'(',  ')',  '[', 和 ']' 组成的序列,找出以该序列为子序列的最短合法序列. 思路:真是经典的题目,区间DP

Lua非常有用的工具——递归打印表数据

Lua是一种非常小巧的语言.虽小,但五脏俱全. 在Lua中,我认为最最核心的数据结构就是表.表不仅可用作数组,还可以用作字典.Lua面向对象的实现也是用表实现的. 表对于Lua实在是太重要了!所以,在开发与调试过程中,让表可视化是非常迫切的需求.可Lua标准库里没有递归显示表中所有数据的函数. 于是,凭着对Lua的兴趣,我写了一个函数用于递归打印表中所有的数据. 废话不多话,如下为源代码: -----------------------------------------------------

递归打印lua中的table

递归打印lua中的table,并写到文件里: 1 local pairs_by_keys = function(inTable) 2 local temp = {} 3 for k, v in pairs(inTable) do 4 temp[#temp + 1] = k 5 end 6 7 local compare = function(a, b) 8 if type(a) == type(b) then 9 return a < b 10 elseif type(a) == "num

Java n个线程轮流打印数字的问题

一. 实现两个线程.轮流打印出数字.例如以下: bThread --> 10 aThread --> 9 bThread --> 8 aThread --> 7 bThread --> 6 aThread --> 5 bThread --> 4 aThread --> 3 bThread --> 2 aThread --> 1 用java中的Lock类实现: package com.yjq.thread_demo; import java.uti

打印数字回环

题目要求: Input a value n, then print out a n×n matrix. Example 1: Input 2, output 1 2 4 3 Example2: Input 5, output 1    2    3    4    5 16   17   18   19    6 15   24   25   20    7 14   23   22   21    8 13   12   11   10    9 思路: 把该输出划分为多个环,每个环上有4根线

打印数字 形状有点得味

打印如下形状的东西: 刚开始看了半天,愣住了,然后才知道了如何做. 一:先来点简单的 就先打印了如下: 这样的还是挺容易的,for循环打印每一行,每一行打印出特定多的,只是在for循环内部确定下一次是要增加打印的个数还是减少,代码: #include <iostream> using namespace std; int main(void) { const int LINES = 15; //n*n的矩形 int cnt = 1; //表示某行该输出多少个数字 for (int i = 0;