递归函数返回None的Python代码|提供输入和输出

时间:2020-07-18 16:21:40

标签: python algorithm recursion

一段时间以来,我一直在用Python改善自己。我执行了这段代码,但似乎并没有得到我实际需要的输出TrueFalse

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

2 个答案:

答案 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 需要处理那个价值。是否需要对该结果做进一步处理。

此外,如果returnbreak结束于if语句的主体,则不需要显式的elseelif代码将永远不会执行:

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的@OlvinR​​oght +1。