保留递归函数参数初始值的一种方法是使用其他关键字参数。通常给这个参数默认值None
,所以函数的调用者不需要初始化这个参数,但是当函数递归地调用它时,它会在需要时被适当地设置。
例如:
def is_substring(sub, string, oldsub=None):
if sub == "":
return True
if string == "":
return False
if oldsub is None:
oldsub = sub
if sub[0] == string[0]:
return is_substring(sub[1:], string[1:], oldsub)
else:
return is_substring(oldsub, string[1:], oldsub)
另一种方式来保持的值是通过定义一个包装函数内的递归函数以产生closure,像这样:
def is_substring(sub, string):
oldsub = sub
def is_substringR(sub, string):
if sub == "":
return True
if string == "":
return False
if oldsub is None:
oldsub = sub
if sub[0] == string[0]:
return is_substringR(sub[1:], string[1:])
else:
return is_substringR(oldsub, string[1:])
return is_substringR(sub, string)
该函数执行相同算法作为早期版本。我很确定这是你试图用你的代码实现的算法。不幸的是,这个算法没有找到正确的子字符串。
所以这里是一个递归is_substring
确实工作正常,但它不需要保留旧的参数值。正如我在说
def is_substring(sub, string):
if sub == "":
return True
if string == "":
return False
if sub == string[:len(sub)]:
return True
else:
return is_substring(sub, string[1:])
:
def is_substring(sub, string):
if sub == "":
return True
if string == "":
return False
if string.startswith(sub):
return True
else:
return is_substring(sub, string[1:])
# some tests
data = (
('misip', 'mississippi'),
('tle', 'cattle'),
)
for sub, target in data:
print('{!r} {!r} {}'.format(sub, target, is_substring(sub, target)))
输出
'misip' 'mississippi' False
'tle' 'cattle' True
如果你不想使用.startswith
方法,您可以用切片代替注释,通常的做子串测试的方法是使用in
运算符,它调用字符串的.__contains__
方法。
sub in string
你可以在这里粘贴你的代码吗? –
你已经发布的代码已递归(?) – Zeokav
是的,但如果你看看我发布的图片,它不能正常工作 –