核心概念

递归(recursion)

/ rih-KUR-zhun /

递归(recursion)是指一个函数通过「调用它自己」来解决问题——而且每次调用的,都是同一个问题里更小的一块。它不写一个大循环,而是说「先处理一小点,剩下的再交回给我」,一遍又一遍,每次咬掉稍微小一点的一口,直到没什么可做为止。

想象你排在一条长队里,想知道自己排第几。你看不到队首,于是拍拍前面那个人问「你是第几号?」他也不知道,便去问他前面的人,如此一路往前——直到最前面那个人说「我是 1 号。」这个答案再顺着队伍传回来,每个人加上一,最后传到你这儿。

让它不会无限转下去的关键是「基准情形(base case)」:问题最简单、能立刻给出答案、不再调用自己的那个版本。「队首的人是 1 号」就是基准情形。一旦忘了写它,函数就会没完没了地调用自己、最终崩溃——也就是「栈溢出(stack overflow)」。每个递归都需要两样东西:一条让问题变小的路,和一个停下来的地方。

def factorial(n):
    if n == 1:        # base case — stop here
        return 1
    return n * factorial(n - 1)  # call itself on a smaller n

factorial(4) 展开成 4 × factorial(3)……一路降到基准情形,再一层层乘回去。

程序员的老梗:要理解递归,你得先理解递归。

又称
recursiverecursive functionself-referencebase case