我有点像python的菜鸟,但我正在尝试创建一个递归函数,它就像内置范围函数一样工作:
def Range (lo, hi):
if lo >= hi:
return []
else:
return [lo, Range (lo+1,hi)]
但它返回多个列表。
而不是[3,4,5,6]
,这是我想要的,它返回[3,[4,[5,[6,[]]]]]
为什么这样,我该如何解决?
答案 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的答案更高效,因为它只创建一个列表(acc
或accumulator
参数)并在递归时传递它。
*这个可能不适用于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)