2016-07-29 90 views
-4

我有一個簡單的遞歸函數:遞歸的方法來建立一個矢量

def subTree(z,sublevels): 

    if(z < sublevels): 
     print "from z = ", z, " to z = ", z+1 
     subTree(z+1,sublevels) 
    else: 
     print "z = ", z, " !" 

這只是從ž去能級,例如:

subTree(2, 6) 
from z = 2 to z = 3 
from z = 3 to z = 4 
from z = 4 to z = 5 
from z = 5 to z = 6 
z = 6 ! 

現在,我怎樣才能讓這個在調用函數返回z的有序向量?

(在例子中這將是:Z [2,3,4,5,6])

從keiv代碼:

def subTree(z,sublevels,a): 
    a.append(z) 
    if(z < sublevels):  
     subTree(z+1,sublevels,a) 


a=[] 
subTree(2,6,a) 
+0

感謝thhe編輯喬恩 – darkpirate

回答

1

我分享keiv.fly的偏見對返回結果遞歸函數:

def subTree(z, sublevels): 
    result = [z] 

    if z < sublevels: 
     result += subTree(z + 1, sublevels) 

    return result 

a = subTree(2, 6) 

它可以降低到稍微低效率的一行:

def subTree(z, sublevels): 
    return [z] + (subTree(z + 1, sublevels) if z < sublevels else []) 

而且兩者可以同時進行修改,以返回一個元組,而不是一個列表:

def subTree(z, sublevels): 
    return (z,) + (subTree(z + 1, sublevels) if z < sublevels else()) 

,我們可以很容易地顛倒順序結果,如果需要的話:

def subTree(z, sublevels): 
    return (subTree(z + 1, sublevels) if z < sublevels else()) + (z,) 

返回:

(6, 5, 4, 3, 2) 

如果你想傳遞數組到函數,那麼我建議你還是回到它作爲一個值,如下所示:

def subTree(z, sublevels, array): 
    array += type(array)([z]) 

    if z < sublevels: 
     array = subTree(z + 1, sublevels, array) 

    return array 

通過這樣做type(array)([z]),以及明確的回報,我們可以使此功能工作對多種數據類型:

a = [] 
a = subTree(2, 6, a) 
print(a) 

a =() 
a = subTree(2, 6, a) 
print(a) 

a = b"" 
a = subTree(ord('2'), ord('6'), a) 
print(a) 

OUTPUT:

[2, 3, 4, 5, 6] 
(2, 3, 4, 5, 6) 
b'23456' 
+0

非常深入的回答,覈准! – darkpirate

0

此代碼的變化 「一」 列表[2 ,3,4,5,6]

def subTree(z,sublevels,a): 
    a.append(z) 
    if(z < sublevels):  
     subTree(z+1,sublevels,a) 

a=[] 
subTree(2,6,a) 
+0

這就是我正在尋找ty – darkpirate

+0

,但不是有點多餘? – darkpirate

+0

你能告訴我你的代碼和我編輯的代碼之間的區別嗎? – darkpirate