1. 程式人生 > >Lintcode371 Print Numbers by Recursion solution 題解

Lintcode371 Print Numbers by Recursion solution 題解

http IT 應該 題解 sar 簡單 pretty 一個 BE

【題目描述】

Print numbers from 1 to the largest number with N digits by recursion.

Notice

It‘s pretty easy to do recursion like:

recursion(i) {

if i > largest number:

return

results.add(i)

recursion(i + 1)

}

however this cost a lot of recursion memory as the recursion depth maybe very large. Can you do it in another way to recursive with at most N depth?

用遞歸的方法找到從1到最大的N位整數。

【註】用下面這種方式去遞歸其實很容易:

recursion(i) {

if i > largest number:

return

results.add(i)

recursion(i + 1)

}

但是這種方式會耗費很多的遞歸空間,導致堆棧溢出。你能夠用其他的方式來遞歸使得遞歸的深度最多只有 N 層麽?

【題目鏈接】

www.lintcode.com/en/problem/print-numbers-by-recursion/

【題目解析】

從小至大打印 N 位的數列,正如題目中所提供的recursion(i), 解法簡單粗暴,但問題在於 N 稍微大一點時棧就溢出了,因為遞歸深度太深了。能聯想到的方法大概有兩種,一種是用排列組合的思想去解釋,把0~9當成十個不同的數(字符串表示),塞到 N 個坑位中,這個用DFS來解應該是可行的;另一個則是使用數學方法,依次遞歸遞推,比如 N=2 可由 N=1遞歸而來,具體方法則是乘10進位加法。題中明確要求遞歸深度最大不超過 N, 故DFS方法比較危險。

【參考答案】

www.jiuzhang.com/solutions/print-numbers-by-recursion/



Lintcode371 Print Numbers by Recursion solution 題解