Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将迭代转换为递归_Python_Recursion_Iteration - Fatal编程技术网

Python 将迭代转换为递归

Python 将迭代转换为递归,python,recursion,iteration,Python,Recursion,Iteration,我试图学习python递归,并试图用递归编写以下问题: 给定一个字符串和一个字符,返回该字符在字符串中显示的次数。 例如:“p”,“Apple”应返回2 下面是我的代码: def count(char,text): if text == '': return 0 elif text[0]==char: return 1 + count(char,text[1:]) return count(char,text[1:]) 下面是正确的代码

我试图学习python递归,并试图用递归编写以下问题: 给定一个字符串和一个字符,返回该字符在字符串中显示的次数。 例如:“p”,“Apple”应返回2

下面是我的代码:

def count(char,text):
    if text == '':
        return 0
    elif text[0]==char:
        return 1 + count(char,text[1:])

    return count(char,text[1:])

下面是正确的代码:D

这里有一种方法可以做到这一点,尽管它的内存效率有点低,因为它必须为每个递归调用创建一个新字符串

def count(char, text):
    if not text:
        return 0
    return (1 if text[0] == char else 0) + count(char, text[1:])
通过传递索引,可以稍微提高内存效率,这样它就可以重用相同的字符串,而不必每次都创建一个新字符串

def count(char, text, i=0)
    if i >= len(text):
        return 0
    return (1 if text[i] == char else 0) + count(char, text, i + 1)
为了向不熟悉它的人解释一些语法,这里是python操作符

在功能上,它与

if text[i] == char:
    return 1
else:
    return 0

它只是比较短,而且仍然易于阅读。

另一种方法是在方法头中放置一个迭代器来遍历每个字符(在这种情况下,您甚至不需要总变量):


这与Brenden Abel的答案几乎相同,但您可以简化递归部分,将其作为要计数的字符和要搜索的字符串的闭包:

def count(char, text):
    def count_helper(index):
        return 0 if index < 0 else (text[index] == char) + count_helper(index-1)
    return count_helper(len(text)-1)
def计数(字符、文本):
def计数辅助程序(索引):
如果索引<0,则返回0,否则返回(text[index]==char)+count\u helper(索引-1)
返回计数\u帮助程序(len(text)-1)

(所谓“简化”,我只是指将参数的数量从3减少到1。)

如果text==''else(如果char==text[0]else 0,则返回0)+count(char,text[1:])
相关:我如何直接编辑代码使其工作?我的代码似乎没有那么离谱,您需要在代码中更改的是,取一个参数total,并添加一个基本情况,其中
如果不是text:return total
,首先删除,这仍然会留下冗余代码,但会给出正确的output@PadraicCunningham如果我们不允许接受任何其他参数该怎么办?因为
bool
int
的一个子类,您可以简单地编写
return(text[i]==char)+count(char,text,i+1)
。我不太熟悉return(1 if text[0]==char else 0)+count(char,text[1:])@user7061872这是Python的条件表达式:
a if b else c
的计算结果为
b
如果
a
为真,
c
为假。谢谢Brendan!你能更具体地告诉我如何编辑我的初始代码吗。唯一能摆脱它的是总变量
def count(char, text, spot)
    if spot >= len(text):
        return 0
    if text[spot] == char:
        return 1 + count(char, text, spot + 1)
    return count(char, text, spot + 1)
def count(char, text):
    def count_helper(index):
        return 0 if index < 0 else (text[index] == char) + count_helper(index-1)
    return count_helper(len(text)-1)