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

时间:2019-02-08 13:08:06

标签: python recursion

我想使用递归检查字母是否在字符串中。我解决此问题的方法是使用set和子集来获取所需的输出,但这不是递归的。我将如何编写递归方法?到目前为止,这是我所做的:

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!")

给出字符串示例:妻子

2 个答案:

答案 0 :(得分:3)

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

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个元素),如果它满足您的谓词,则继续使用列表的“尾部”进行递归。

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

l = [1,2,3]
print(l[1:]) # create a new list from index 1
# Outputs: [2,3]

由于python的索引为零,因此1表示第二个元素。

为了支持@cdlane所指出的重复字母,递归可以沿输入传递,并替换出现的情况:

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

答案 1 :(得分:2)

远离基于集合的解决方案是解决其灰色区域的机会:如何处理重复字母。即letters = ["f", "f"]"wife""giraffe"。基于集合的解决方案会同时返回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))

输出

> python3 test.py
False
True
>