2016-07-29 92 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