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

0 投票
4 回答
787 浏览
提问于 2025-04-17 06:23

我对Python还不是很熟悉,但我正在尝试创建一个递归函数,它的功能和内置的range函数一样:

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

但是它返回了多个列表。

我想要的是 [3,4,5,6],但它却返回了 [3,[4,[5,[6,[]]]]]

这是为什么呢?我该怎么解决这个问题?

4 个回答

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

但是你可能会遇到栈溢出的问题

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)
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,是成立的。

撰写回答