将迭代转换为递归

时间:2016-10-23 22:00:15

标签: 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:])

这是正确的代码:D

3 个答案:

答案 0 :(得分:2)

这是你可以做到的一种方式,虽然它有点内存效率低,因为它必须为每个递归调用创建一个新的字符串。

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 ternary运算符

1 if text[i] == char else 0

在功能上,它与

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

它只是更短,仍然易于阅读。

答案 1 :(得分:0)

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

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)

答案 2 :(得分: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)

(通过“简化”,我的意思是将参数数量从3减少到1。)