Python 递归检查字母是否在给定字符串中

Python 递归检查字母是否在给定字符串中,python,recursion,Python,Recursion,我想使用递归检查字母是否在字符串中。我解决这个问题的方法是使用集合和子集来获得我想要的输出,但这不是递归的。我将如何编写递归方法?以下是我迄今为止所做的工作: import sys userInput = str(sys.argv[1]) letters = ["e", "f"] if set(letters).issubset(userInput): print(userInput +" exist in these 2 letters!) else: print(use

我想使用递归检查字母是否在字符串中。我解决这个问题的方法是使用集合和子集来获得我想要的输出,但这不是递归的。我将如何编写递归方法?以下是我迄今为止所做的工作:

import sys


userInput = str(sys.argv[1])
letters = ["e", "f"]

if set(letters).issubset(userInput):
    print(userInput +" exist in these 2 letters!)
else:
    print(userInput + " does not exist in these 2 letters!")

给定字符串示例:妻子

我认为您的解决方案很好,但如果您确实想要递归函数,那么下面函数的格式是函数编程的典型格式:

def check_letters(compare_to, lst):
    if len(lst) == 0:
        return True
    else:
        if lst[0] in compare_to:
            return check_letters(compare_to, lst[1:]) # recursive step
        else:
            return False

if check_letters(userInput, letters):
    ...
因此,我们的想法是检查列表第0个元素的开头,如果它满足您的谓词,则使用列表的结尾继续递归

因此,每个递归步骤都会检查列表中的第一个元素,然后将列表的其余部分转发到递归中。我在这里使用:

因为python的索引为零,所以1表示第二个元素

为了支持中指出的重复字母,递归可以在替换出现项的情况下沿输入传递:

return check_letters(compare_to.replace(lst[0], "", 1), lst[1:]) # recursive step

我认为您的解决方案很好,但如果您确实想要递归函数,那么下面函数的格式是函数编程的典型格式:

def check_letters(compare_to, lst):
    if len(lst) == 0:
        return True
    else:
        if lst[0] in compare_to:
            return check_letters(compare_to, lst[1:]) # recursive step
        else:
            return False

if check_letters(userInput, letters):
    ...
因此,我们的想法是检查列表第0个元素的开头,如果它满足您的谓词,则使用列表的结尾继续递归

因此,每个递归步骤都会检查列表中的第一个元素,然后将列表的其余部分转发到递归中。我在这里使用:

因为python的索引为零,所以1表示第二个元素

为了支持中指出的重复字母,递归可以在替换出现项的情况下沿输入传递:

return check_letters(compare_to.replace(lst[0], "", 1), lst[1:]) # recursive step

离开基于集合的解决方案是一个解决其灰色区域的机会:如何处理重复的字母。比如字母=[f,f]对妻子和长颈鹿。基于集合的解决方案对两者都返回True。但我们可以采取其他措施:

def check_letters(string, array):
    if not array:
        return True

    head, *tail = array

    index = string.find(head)

    if index == -1:
        return False

    return check_letters(string[:index] + string[1 + index:], tail)

letters = ["f", "f", "s"]

userInput = "false"

print(check_letters(userInput, letters))

userInput = "falsify"

print(check_letters(userInput, letters))
输出


离开基于集合的解决方案是一个解决其灰色区域的机会:如何处理重复的字母。比如字母=[f,f]对妻子和长颈鹿。基于集合的解决方案对两者都返回True。但我们可以采取其他措施:

def check_letters(string, array):
    if not array:
        return True

    head, *tail = array

    index = string.find(head)

    if index == -1:
        return False

    return check_letters(string[:index] + string[1 + index:], tail)

letters = ["f", "f", "s"]

userInput = "false"

print(check_letters(userInput, letters))

userInput = "falsify"

print(check_letters(userInput, letters))
输出


这是一个需要递归函数的赋值吗?否则,没有理由在该场景中使用它。我只是想确保理解。不,这不是一个赋值,我知道还有其他方法可以做到这一点,我只是想知道如何使用递归方法,我是Python新手,我知道我上面所做的满足了我的要求,我只想知道这是一个需要有递归函数的赋值吗?否则,没有理由在该场景中使用它。我只是想确保理解。不,这不是一个任务,我知道还有其他方法可以做到这一点,我只是想知道如何使用递归方法来做到这一点,我是Python新手,我知道我上面所做的实现了我想要的,我只想知道更多谢谢!它起作用了!多亏了您或更简单的帮助,我今天学到了一些新东西:在compare\u to和check\u letters compare\u to中返回lst[0],lst[1:],甚至在compare\u to和check\u letters compare\u to中返回lenlst==0或lst[0],lst[1:],这会在一行中完成所有操作。@Alfe是的,但可读性可能较差。你可以在compare to和check letters compare to中用一行返回lenlst==0或lst[0],我猜是lst[1]。编辑:啊,你赢了我-P@kraljevocs否,lst[1:]返回索引为1的新列表,直到结束。因此,除了第一个元素外,实际上是相同的列表。因此,对于每个递归步骤,列表将变小1@杰普哦,对了,我现在明白了,谢谢杰普!你帮了我大忙,太感谢你了!它起作用了!多亏了您或更简单的帮助,我今天学到了一些新东西:在compare\u to和check\u letters compare\u to中返回lst[0],lst[1:],甚至在compare\u to和check\u letters compare\u to中返回lenlst==0或lst[0],lst[1:],这会在一行中完成所有操作。@Alfe是的,但可读性可能较差。你可以在compare to和check letters compare to中用一行返回lenlst==0或lst[0],我猜是lst[1]。编辑:啊,你赢了我-P@kraljevocs否,lst[1:]返回索引为1的新列表,直到结束。因此,除了第一个元素外,实际上是相同的列表。因此,对于每个递归步骤,列表将变小1@杰普哦,对了,我现在明白了,谢谢杰普!你帮了我很多。谢谢你为帮助我所做的努力!我会注意的!重复的字母甚至子字符串也可以直接使用:字母=[e,ff]。但是,您的解决方案在很多情况下都不起作用,因为您删除了搜索给定键的字符串部分。例如,对于字母=[a,b],输入ba时失败,因为您在查找a时搜索了b之外的字母。@Jeppe,字母=[f,f]案例适用于false vs.false,而不是双字母。英国航空公司的问题我已经解决了-谢谢@啊,我的坏。我用一种方法更新了我的答案,即在匹配后替换一封信。善款
关于:-谢谢你的帮助!我会注意的!重复的字母甚至子字符串也可以直接使用:字母=[e,ff]。但是,您的解决方案在很多情况下都不起作用,因为您删除了搜索给定键的字符串部分。例如,对于字母=[a,b],输入ba时失败,因为您在查找a时搜索了b之外的字母。@Jeppe,字母=[f,f]案例适用于false vs.false,而不是双字母。英国航空公司的问题我已经解决了-谢谢@啊,我的坏。我用一种方法更新了我的答案,即在匹配后替换一封信。贡献良多-