Python:递归函数的基本情况

时间:2016-08-19 19:19:25

标签: python function recursion

目前我正在尝试使用Python中的递归函数。我在互联网上阅读了一些关于它们的内容,我自己也构建了一些简单的函数递归函数。虽然,我仍然不确定如何使用基本情况。

我知道精心设计的递归函数满足以下规则:

  • 有一个基本案例。
  • 递归步骤适用于基本情况。
  • 子问题的解决方案为原始问题提供了解决方案。

现在我想谈谈我的问题:是否允许从多个陈述中构成一个基本案例?

换句话说,是以下自编脚本的基本情况,有效吗?

def checkstring(n, string):

 if len(string) == 1:
    if string == n:
        return 1
    else:
        return 0


 if string[-1:] == n:
    return 1 + checkstring(n, string[0:len(string) - 1])
 else:
    return checkstring(n, string[0:len(string) - 1])
print(checkstring('l', 'hello'))

3 个答案:

答案 0 :(得分:2)

是的,当然是:基本情况的唯一要求是它不会递归调用函数。除此之外,它可以做任何想做的事。

答案 1 :(得分:0)

这是绝对精细且有效的功能。请记住,对于可以从中调用递归函数的任何场景,应该有一个可通过递归流访问的基本案例。

例如,看看下面的(愚蠢的)递归函数:

def f(n):
    if n == 0:
        return True
    return f(n - 2)

这个函数永远不会达到它的基本情况(n == 0),如果它被调用为奇数,就像5.你想避免这样的场景并考虑函数可以得到的所有可能的基本情况(在上面的例子,那将是0和1)。所以你会做类似

的事情
def f(n):
    if n == 0:
        return True
    if n == 1:
        return False
    if n < 0:
        return f(-n)
    return f(n - 2)

现在,这是正确的功能(有几个ifs检查数字是否均匀)。

另请注意,您的功能会很慢。原因是Python字符串切片很慢并且适用于O(n),其中n是切片字符串的长度。因此,建议尝试非递归解决方案,以便每次都不能重新切片。

另请注意,有时功能没有严格的基本情况。例如,请考虑遵循暴力函数打印所有现有的4位数组合:

def brute_force(a, current_digit):
    if current_digit == 4:
        #  This means that we already chosen all 4 digits and
        #  we can just print the result
        print a
    else:
        #  Try to put each digit on the current_digit place and launch
        #  recursively
        for i in range(10):
            a[current_digit] = i
            brute_force(a, current_digit + 1)

a = [0] * 4
brute_force(a, 0)

这里,因为函数不返回任何东西,只考虑不同的选项,我们没有基本情况。

答案 2 :(得分:0)

简单来说是的,只要它不需要递归调用函数来到达基本情况。其他一切都是允许的。