一段时间以来,我一直在用Python改善自己。我执行了这段代码,但似乎并没有得到我实际需要的输出True
或False
。
def cathat(str,cat,hat):
#print("Cat: {} Hat: {} Strlen: {}".format(cat,hat,len(str)))
if len(str) is 0:
if cat == hat:
print("True") #For debugging purpose
return True
else:
print("False") #For debugging purpose
return False
else:
if str.startswith("cat"):
cathat(str[3:],cat + 1,hat)
elif str.startswith("hat"):
cathat(str[3:],cat,hat + 1)
else:
cathat(str[1:],cat,hat)
def cat_hat(str):
return cathat(str, 0, 0)
对于输入:
2
catinahat
bazingaa
您的输出是:
True
None
True
None
预期输出为:
True
True
答案 0 :(得分:1)
此代码段执行cathat
,但对其结果不执行任何操作:
else:
if str.startswith("cat"):
cathat(str[3:],cat + 1,hat)
elif str.startswith("hat"):
cathat(str[3:],cat,hat + 1)
else:
cathat(str[1:],cat,hat)
在所有这些情况下,您都想return cathat(...)
。
注意:str
是变量的坏名字,因为它会覆盖内置的类型/函数str
!
def cat_hat(string: str, cat: int = 0, hat: int = 0, debug: bool = False) -> bool:
if debug:
print(f"Cat: {cat} Hat: {hat} String: '{string}'")
if len(string) == 0:
if debug:
print(f"returning {cat == hat}")
return cat == hat
else:
if string.startswith("cat"):
return cat_hat(string[3:], cat + 1, hat, debug)
elif string.startswith("hat"):
return cat_hat(string[3:], cat, hat + 1, debug)
else:
return cat_hat(string[1:], cat, hat, debug)
cat_hat("catinahat", debug=True)
打印:
Cat: 0 Hat: 0 String: 'catinahat'
Cat: 1 Hat: 0 String: 'inahat'
Cat: 1 Hat: 0 String: 'nahat'
Cat: 1 Hat: 0 String: 'ahat'
Cat: 1 Hat: 0 String: 'hat'
Cat: 1 Hat: 1 String: ''
returning True
答案 1 :(得分:0)
对于递归新手来说,您犯了一个错误,因为如果递归函数返回一个值,并且 you 递归调用它,则 you 需要处理那个价值。是否需要对该结果做进一步处理。
此外,如果return
或break
结束于if
语句的主体,则不需要显式的else
或elif
代码将永远不会执行:
def cat_hat(string, cat=0, hat=0):
if not string:
return cat == hat
if string.startswith("cat"):
return cat_hat(string[3:], cat + 1, hat)
if string.startswith("hat"):
return cat_hat(string[3:], cat, hat + 1)
return cat_hat(string[1:], cat, hat)
print(cat_hat("catinahat")) # both 1
print(cat_hat("bazingaa")) # both 0
print(cat_hat("Watch me pull a rabbit out of my hat.")) # hat > cat
输出
> python3 test.py
True
True
False
>
关于is
与==
和@Samwise关于重新定义str
的@OlvinRoght +1。