2017-10-15 155 views
-1

我正在編寫一個Python函數nest(a, b),其值爲ab。然後將值a放在list的內部,放在另一個列表中,依此類推,直到n個級別。Python - 將字符串遞歸列表遞歸到n級

例如:

nest("foo", 3) 

應該返回:

[[[["foo"]]]] 
+0

確定。你有什麼嘗試? –

+0

這個板子是關於幫助你解決一個具體的問題。因此你必須自己做一些工作。一個問題,如:我想xy你可以爲我編程通常需要一個專業人士,因此花錢;) –

+1

我想'巢(「foo」,0)'應該''foo「',而不是'[」foo 「]',這意味着'nest(」foo「,3)'應該是'[[」foo「]]]''。 – chepner

回答

2

你可以寫一個recursive function實現這一目標爲:

def my_func(s, n): 
    return [s] if n == 0 else [my_func(s, n-1)] 

樣品試驗:

>>> my_func('foo', 3) 
[[[['foo']]]] 

注意: Python解釋器堆棧允許有最大遞歸限制。此限制可防止無限遞歸導致C堆棧溢出並導致Python崩潰。

可以使用sys.getrecursionlimit()功能檢查該值按照商務部:

返回的遞歸限制的當前值的 Python解釋器堆棧的最大深度。此限制可防止無限遞歸 導致C堆棧溢出並導致Python崩潰。它可以是由setrecursionlimit()設置的 。

+3

即使沒有限制,遞歸也是一種在Python中實現它的糟糕方式,需要額外的函數調用需要大量的內存和大量的開銷。 – chepner

3

你可以試試這個,

def nest(obj, depth): 
    ret = obj 
    for _ in range(depth): 
     ret = [ret] 
    return ret 
+1

這不會給出正確的結果,你的意思是'ret = [ret]'? – MSeifert

+0

是的,我的意思是。對不起,這個愚蠢的錯誤 – bassman

+0

至少基於原始問題的例子,你在這裏有一個錯誤的錯誤; 'nest(obj,3)'將返回'[[[obj]]]',而不是'[[[obj]]]]'。爲了匹配OP,應該初始化'ret = [obj]'。不過,我認爲這是一個更合理的解釋,其中'nest(obj,0)'是一個no-op,而不是將'obj'包裝在一個列表中。 – chepner

1

這是一個遞歸解決方案,它幾乎順其自然從問題的定義:

def nest(val, n): 
    if n <= 0: 
    return val 
    else: 
    return [ nest(val, n - 1) ]