为什么我的Python函数返回多个括号?
我对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 的答案更有效,因为它只创建一个列表(就是 acc
或 accumulator
参数),并在递归时传递这个列表。
* 这 可能 对 Python 语言来说不一定成立,但我99%确定在最常见的 Python 实现中,即 CPython,是成立的。