无法理解递归

时间:2012-08-05 22:57:07

标签: python

Python新手并尝试理解递归。我正在尝试创建一个程序,打印出使用递归函数在字符串'target'中找到字符串'key'的次数,如MIT介绍课程problem set的问题1中所示。我在试图弄清楚函数的运行方式时遇到了问题。我已经阅读了文档和一些教程,但有没有人有任何关于如何更好地理解递归以帮助我修复此代码的提示?

from string import *

def countR(target,key):
    numb = 0
    if target.find(key) == -1:
        print numb
    else:
        numb +=1
        return countR(target[find(target,key):],key)

countR('ajdkhkfjsfkajslfajlfjsaiflaskfal','a')

4 个答案:

答案 0 :(得分:8)

通过递归,您希望将问题拆分为可以独立解决的较小子问题,然后将它们的解决方案组合在一起以获得最终解决方案。

在您的情况下,您可以将任务分为两部分:检查key第一次出现的位置(如果),然后以其他方式递归计算。

那里有一把钥匙:
  - 否:返回0.
  - 是:删除key并说明其他方面的密钥数为1 + key

在代码中:

def countR(target,key):
    if target.find(key) == -1:
        return 0
    else:
        return 1+ countR(target[target.find(key)+len(key):],key)

修改
然后,以下代码打印出所需的结果:

print(countR('ajdkhkfjsfkajslfajlfjsaiflaskfal','a'))

答案 1 :(得分:1)

这不是递归的工作原理。 numb没用 - 每次进入递归时,numb再次创建为0,因此它只能是0或1 - 绝不是您寻求的实际结果。

递归的工作原理是找到一个较小的问题的答案,并使用它来解决大问题。在这种情况下,您需要在不包含第一个外观的字符串中查找键的出现次数,并向其中添加1。

此外,您需要实际推进切片,以便您找到的字符串不会再次出现。

from string import *

def countR(target,key):
    if target.find(key) == -1:
        return 0
    else:
        return 1+countR(target[target.find(key)+len(key):],key)

print(countR('ajdkhkfjsfkajslfajlfjsaiflaskfal','a'))

答案 2 :(得分:1)

我见过的大多数递归函数都指出了返回一个有趣的值,更高的帧构建在这个值上。你的功能不能做到这一点,这可能是让你感到困惑的原因。这是一个递归函数,它为您提供整数的阶乘:

def factorial(n):
    """return the factorial of any positive integer n"""
    if n > 1:
        return n * factorial(n - 1)
    else:
        return 1 # Cheating a little bit by ignoring illegal values of n

以上功能演示了我称之为" normal"一种递归 - 内帧返回的值由外框操作。

你的功能有点不寻常:

  1. 并不总是返回值。
  2. 外框不对内框的返回值做任何事情。
  3. 让我们看看我们是否可以重构它以遵循更传统的递归模式。 (写成剧透语法,这样你就可以看到你是否可以自己得到它,首先):

      

    def countR(target,key):     idx = target.find(key)`     如果idx> -1:         返回1 + countR(目标[idx + 1:],键)     其他:         返回0

    这里,countR每次找到目标时都会添加1,然后在字符串的其余部分重复出现。如果它没有找到匹配,它仍会返回一个值,但它会做两件关键的事情:

    1. 添加到外框时,不会更改该值。
    2. 不再发生任何事情。
    3. (好吧,关键的事情是做的事情。你得到了照片。)

      元/编辑:尽管this meta article显然无法在剧透文本中实际正确格式化代码。因此,我会将其保留为未格式化,直到该功能得到修复,或永远保留,以先到者为准。

答案 3 :(得分:0)

如果在目标中找不到键,则打印麻木,否则创建一个新的字符串,该字符串在找到的事件之后开始(因此切掉开头)并从那里继续搜索。