递归函数的两种方法中哪一种似乎是更好的方法?
处理一个:current_number
存储为min_number:
def sum_numbers_between(min_number, max_number):
if min_number == max_number:
return min_number
else:
return min_number + sum_numbers_between(min_number+1, max_number)
采用两种方法:current_number
作为单独的参数存储。
def sum_numbers_between(min_number, max_number, current_number=None):
if current_number is None: current_number=min_number
if current_number == max_number:
return current_number
else:
return current_number + sum_numbers_between(min_number=min_number, max_number=max_number, current_number=current_number+1)
>> sum_numbers_between(1,3) # 6
是否认为一种方法比另一种更好?如果是这样,为什么? (使用静态min_number
和max_number
变量,第二种方法对我来说似乎更容易理解。)
答案 0 :(得分:1)
注意:我仅将此函数作为递归的示例,而不支持对特定问题使用递归。实际上,我会使用循环或内置的sum
函数以非递归方式实现此函数。
没有理由不使用第一种方法。如果有的话,我会修改它以处理任何一对数字;如果“最小”数字实际上大于最大数字,则可以将总和定义为0。
def sum_numbers_between(min_number, max_number):
if min_number > max_number:
return 0
else:
return min_number + sum_numbers_between(min_number+1, max_number)
您也可以朝另一个方向递归,从最大值倒数。
def sum_numbers_between(min_number, max_number):
if min_number > max_number:
return 0
else:
return max_number + sum_numbers_between(min_number, max_number-1)
如果要区分非递归入口点和递归帮助器,可以使用闭包,以便递归函数仅采用一个变化的参数。
def sum_numbers_between(min_number, max_number):
def helper(n):
if n > max_number:
return 0
return n + helper(n+1)
return helper(min_number)
在这里,max_number
永远不会改变,因此helper
不再是递归函数的参数,而是简单地关闭了传递给sum_numbers_between
的值以开始。这样做的好处是,您永远不会“意外”将max_number
的错误值传递给helper
,因为它不再是参数。
答案 1 :(得分:0)
通过两端彼此相对移动,是否会是一种更好的方法来更快地结束(无效的)递归:
def sum_numbers_between(min_number, max_number):
if min_number > max_number:
return 0
if min_number == max_number:
return min_number
return min_number + max_number + sum_numbers_between(min_number+1, max_number-1)