在递归函数中定义参数

时间:2020-02-03 21:00:38

标签: python python-3.x recursion

递归函数的两种方法中哪一种似乎是更好的方法?

处理一个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_numbermax_number变量,第二种方法对我来说似乎更容易理解。)

2 个答案:

答案 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)