以前看过一个关于递归的段子:你要理解递归,首先需要理解递归。
初看觉得这句话很有意思,言简意赅地讲述理解递归时的烦恼。但是,其实这是一个严重的误导!!!!
许多人觉得递归函数很难理解。大部分的理解难处,来自于对函数使用了错误的比喻。人们倾向于把函数理解为某种机器。原物料像实参一样抵达;某些工作委派给其它函数;最后组装起来的成品,被作为返回值运送出去。如果我们用这种比喻来理解函数,那递归就自相矛盾了。机器怎可以把工作委派给自己?它已经在忙碌中了。
较好的比喻是,把函数想成一个处理的过程。日常生活中我们经常看到递归的过程。举例来说,假设一个历史学家,对欧洲历史上的人口变化感兴趣。研究文献的过程很可能是:
取得一个文献的复本
寻找关于人口变化的资讯
如果这份文献提到其它可能有用的文献,研究它们。
过程是很容易理解的,而且它是递归的,因为第三个步骤可能带出一个或多个同样的过程。
所以,别把 递归 想成是一种测试某个东西是否满足要求的机器。而是把它想成是,决定某个东西是否满足要求的规则。应该把递归理解一个验证的规则,而不是理解为一个封闭的验证盒子。