目前我正在尝试使用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'))
答案 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)
简单来说是的,只要它不需要递归调用函数来到达基本情况。其他一切都是允许的。