用遞迴的方法找到從1到最大的n位整數。
注意事項
用下面這種方式去遞迴其實很容易:
recursion(i)
但是這種方式會耗費很多的遞迴空間,導致堆疊溢位。你能夠用其他的方式來遞迴使得遞迴的深度最多只有 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]
.
第一種:
用字串模擬數字
class solution
char * number = new char[n+1];
//bool flag = false;
number[n] = '\0';
for(int i = 0; i< 10; i++)
delete number;//new 完後要記得釋放記憶體
return numarr;
} void recursion(vector&numarr,char * num,int length ,int index)
return;
}for(int i = 0; i< 10; i++)
return;//這裡之前忘記寫return了,這個是計算完第i位(i+1位後面的也計算完返回了,如果不加return,直接停在這一層,所以不會繼續返回到第i-1位的計算當中)
}};
第二種:
遞迴的深度最多只有n層,說明每一位是一次遞迴,其實也就是先把i-1層的都算出來,再計算第i層的就行
class solution ;
return ret;
} else
} return ret;
} }
};
第三種:
做法類似於列印全排列,走一遍全排列的列舉樹,從最高位開始一位一位地遍歷,直到最低位形成乙個數字,每一位都有0~9(十叉樹)
class solution ;
vectorret; //當前層的結果
vectortmp=numbersbyrecursion(n-1); //取用上一層的結果
copy(tmp.begin(),tmp.end(),back_inserter(ret)); //放進當前層中
for(int i=1;i<=9;++i)
return ret;
}};
第四種:
class solution
void dfs(vector& nums, int n, int cur)
for (int i = 0; i < 10; ++i)
}};
第五種:
遞迴使得遞迴的深度最多為n。將1-10定為一層,10-100定為一層,那麼輸入n,最多就迴圈n層。
class solution
return print(1,n); //列印從1開始的n位數
}vectorprint(int i, int n){
if( n>=1 ){ //依次將1-9,10-99,100-999放入容器內
int max = i*10;
for(int j=i; j
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 但是這種方式會耗費很多的遞迴空間,導致堆疊溢位。你能夠用其他的方式來遞迴使...
Lintcode 用遞迴列印數字
用遞迴的方法找到從1到最大的n位整數。注意事項 用下面這種方式去遞迴其實很容易 recursion i 但是這種方式會耗費很多的遞迴空間,導致堆疊溢位。你能夠用其他的方式來遞迴使得遞迴的深度最多只有 n 層麼?樣例 給出 n 1,返回 1,2,3,4,5,6,7,8,9 給出 n 2,返回 1,2,...
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 挑戰 用遞迴完成,而非迴圈的方式。方法一 迴圈輸出 最大的數為10 n 1 class solution for int j 1 ...