The*_*oxx 0 python recursion brackets
我有点像python的菜鸟,但我正在尝试创建一个递归函数,就像内置范围函数一样:
def Range (lo, hi):
if lo >= hi:
return []
else:
return [lo, Range (lo+1,hi)]
Run Code Online (Sandbox Code Playgroud)
但它返回多个列表.
而不是[3,4,5,6],这就是我想要的,它的归还[3,[4,[5,[6,[]]]]]
为什么是这个以及如何解决它?
当你这样递归时,Range每次都返回一个列表:
Range(3,7)
# translates to
[3, Range(4,7)]
# which translates to
[3, [4, Range(5,7)]]
# etc.
Run Code Online (Sandbox Code Playgroud)
为了避免这种情况,请将您的列表添加到一起:
def Range (lo, hi):
if lo >= hi:
return []
else:
return [lo] + Range(lo+1, hi)
Run Code Online (Sandbox Code Playgroud)
编辑:
作为@delnan指出,这个功能是非常低效的-它没有尾巴调用优化语言都递归* 和它产生两个(可能是3递归的每个级别)的新名单.@ mipadi的答案更高效,因为它只创建一个列表(acc或accumulator参数)并在递归时传递它.
*对于Python语言可能不是这样,但我99%肯定对于最常见的Python实现,即CPython.