=========================> Chapter 3 <=========================
C语言中递归的形式
===============================================================
章首言
===============================================================
关于递归的形式,需要一些基本的分析和综合,或者说需要一些洞察。
这正是解决任何一个问题的基本方法,首先分析该问题的表现形式,是否能够穷尽它的表现形式,然后开始综合,抽象出一般的结论。
前述已经提及,C语言中的递归只限于有终止的递归。
这里直接给出结论先,然后开始一些实例,最后重复该结论。
1. 递归的形式分类
1). C语言中的递归首先分为直接的递归和间接的递归。
所谓直接递归,就是函数foo实现中直接调用foo. 所谓间接递归, 就是函数foo实现中不直接调用foo, 而是调用函数bar, 但是函数bar又调用函数foo.
2). 直接的递归分为线形的递归和树形的递归[也称单路递归和多路递归]。
所谓线形的递归,是指函数foo的实现中,只调用它自身一次。
所谓树形的递归,是指函数foo的实现中,调用它自身多次。
3). 根据递归调用是否出现在函数尾部, 将递归分为尾递归和非尾递归。
2. 关于递归的结论
1). 所有间接递归都可以化解为直接递归。
这个洞察是很简单的, 但需要到最后才给出一个实例。
2). 所有尾递归都可以直接化解为迭代处理,不需要用栈。
3). 所有递归都可以用栈处理
这是显然的,前面已经非形式化地证明过,递归就是栈处理的。
4). 并非所有递归都可以化解为迭代处理[这里的迭代处理是指, 不使用栈的迭代]。
这某种程度上显然的, 因为递归的本质是栈处理的。然而形式化或者非形式化地证明它却可能相当困难,所以LZ只是给出这个结论,有兴趣做证明的不妨自己动手。
===============================================================
C语言中递归的形式
===============================================================
章首言
===============================================================
关于递归的形式,需要一些基本的分析和综合,或者说需要一些洞察。
这正是解决任何一个问题的基本方法,首先分析该问题的表现形式,是否能够穷尽它的表现形式,然后开始综合,抽象出一般的结论。
前述已经提及,C语言中的递归只限于有终止的递归。
这里直接给出结论先,然后开始一些实例,最后重复该结论。
1. 递归的形式分类
1). C语言中的递归首先分为直接的递归和间接的递归。
所谓直接递归,就是函数foo实现中直接调用foo. 所谓间接递归, 就是函数foo实现中不直接调用foo, 而是调用函数bar, 但是函数bar又调用函数foo.
2). 直接的递归分为线形的递归和树形的递归[也称单路递归和多路递归]。
所谓线形的递归,是指函数foo的实现中,只调用它自身一次。
所谓树形的递归,是指函数foo的实现中,调用它自身多次。
3). 根据递归调用是否出现在函数尾部, 将递归分为尾递归和非尾递归。
2. 关于递归的结论
1). 所有间接递归都可以化解为直接递归。
这个洞察是很简单的, 但需要到最后才给出一个实例。
2). 所有尾递归都可以直接化解为迭代处理,不需要用栈。
3). 所有递归都可以用栈处理
这是显然的,前面已经非形式化地证明过,递归就是栈处理的。
4). 并非所有递归都可以化解为迭代处理[这里的迭代处理是指, 不使用栈的迭代]。
这某种程度上显然的, 因为递归的本质是栈处理的。然而形式化或者非形式化地证明它却可能相当困难,所以LZ只是给出这个结论,有兴趣做证明的不妨自己动手。
===============================================================




