为什么我的python函数返回多个括号?

时间:2011-11-15 18:49:34

标签: python recursion brackets

我有点像python的菜鸟,但我正在尝试创建一个递归函数,它就像内置范围函数一样工作:

def Range (lo, hi):
    if lo >= hi:
        return []
    else:
        return [lo, Range (lo+1,hi)]

但它返回多个列表。

而不是[3,4,5,6],这是我想要的,它返回[3,[4,[5,[6,[]]]]] 为什么这样,我该如何解决?

4 个答案:

答案 0 :(得分:5)

当你这样递归时,Range每次都会返回一个列表:

Range(3,7)
# translates to
[3, Range(4,7)]
# which translates to
[3, [4, Range(5,7)]]
# etc.

为了避免这种情况,请将您的列表添加到一起:

def Range (lo, hi):
    if lo >= hi:
        return []
    else:
        return [lo] + Range(lo+1, hi)

修改

正如@delnan指出的那样,这个函数非常效率低下 - 它都是在没有尾调用优化的语言中进行递归 * 它为每个递归级别生成两个(可能是三个)新列表。 @ mipadi的答案更高效,因为它只创建一个列表(accaccumulator参数)并在递归时传递它。

*这个可能不适用于Python语言,但我99%确定它适用于最常见的Python实现,即CPython。 < / p>

答案 1 :(得分:3)

您的Range函数返回一个列表,因此在最后一行中,您将返回列表中的列表。您可能应该做的是维护累加器并为其添加值:

def Range(lo, hi, acc=None):
    if acc is None:
        acc = []
    if lo >= hi:
        return acc
    else:
        acc.append(lo)
        return Range(lo+1, hi, acc)

答案 2 :(得分:1)

def Range (lo, hi):
    if lo >= hi:
        return []
    else:
        return [lo] + Range (lo+1, hi)

但你可能会得到StackOverflow

答案 3 :(得分:0)

每次递归到Range都会返回一个列表,这是前一个递归列表中的第二个元素。当然Python has a built-in function for this,但如果你想自己构建它,你可能只想以

结束
return [lo] + Range(lo+1, hi)