努力建立递归的直觉

时间:2020-04-28 04:31:18

标签: recursion

尽管我已经学习并能够理解递归中的某些程序,但我仍然无法像使用迭代那样轻松地直观地获得使用递归的解决方案。是否有任何课程或课程可用来建立递归的直觉?一个人如何掌握递归的概念?

1 个答案:

答案 0 :(得分:0)

如果您想全面了解递归的工作原理,强烈建议您先了解mathematical induction,因为两者之间有着密切的联系,甚至可以说并非完全相同。

递归是一种将看似复杂的问题分解为较小部分的方法。考虑一个阶乘函数的简单例子。

def factorial(n):
    if n < 2:
        return 1
    return n * factorial(n - 1)

例如,要计算factorial(100),只需要计算factorial(99)并乘以100。这是基于对阶乘的熟悉定义。

以下是一些提出递归解决方案的提示:

  • 假设您知道前一个递归调用返回的结果(例如,在计算factorial(100)时,假设您已经知道factorial(99)的值。如何从那里开始?)
  • 考虑基本情况(即何时应该停止递归?)

第一个要点可能看起来很抽象,但这仅意味着:大部分工作已经完成。您如何从那里完成任务?对于阶乘,factorial(99)构成了大部分工作。在许多情况下,您会发现识别这部分工作仅相当于检查函数的自变量(例如,阶乘n),并假定您已经拥有func(n - 1)的答案。

这是具体性的另一个例子。假设我们要在不使用内置函数的情况下反转字符串。在使用递归时,我们可以假设string[:-1]或直到最后一个字符的子字符串已经被反转。然后,所有需要做的就是将最后剩余的字符放在前面。利用这一灵感,我们可能会提出以下递归解决方案:

def my_reverse(string):
    if not string: # base case: empty string
        return string # return empty string, nothing to reverse
    return string[-1] + my_reverse(string[:-1])
综上所述,递归建立在数学归纳之上,而这两个是不可分割的思想。实际上,可以很容易地证明归纳算法可以使用归纳法工作。我强烈建议您检出此lecture