函数的递归调用与分治策略递归方法是算法和程序设计中的一种重要技术。递归方法即通过函数或过程调用自身将问题转化为本质相同但规模较小的子问题。递归方法具有易于描述和理解、证明简单等优点,在动态规划、贪心算法、回溯法等诸多算法中都有着极为广泛的应用,是许多复杂算法的基础。递归方法中所使用的“分而治之”的策略也称分治策略。递归方法的构造构造递归方法的关键在于建立递归关系。这里的递归关系可以是递归描述的,也可以是递推描述的。下面由一个求 n 的阶乘的程序为例,总结出构造递归方法的一般步骤。[例 1]从键盘输入正整数 N(0<=N<=20),输出 N!。[分析]N!的计算是一个典型的递归问题。使用递归方法来描述程序,十分简单且易于理解。[步骤 1]描述递归关系 递归关系是这样的一种关系。设{U1,U2,U3,…,Un…}是一个序列,如果从某一项 k 开始,Un 和它之前的若干项之间存在一种只与 n 有关的关系,这便称为递归关系。注意到,当 N>=1 时,N!=N*(N-1)!(N=1 时,0!=1),这就是一种递归关系。对于特定的K!,它只与 K 与(K-1)!有关。[步骤 2]确定递归边界 在步骤 1 的递归关系中,对大于 k 的 Un 的求解将最终归结为对 Uk 的求解。这里的 Uk 称为递归边界(或递归出口)。在本例中,递归边界为 k=0,即 0!=1。对于任意给定的 N!,程序将最终求解到 0!。确定递归边界十分重要,如果没有确定递归边界,将导致程序无限递归而引起死循环。例如以下程序:#include int f(int x){ return(f(x-1));}main(){ cout<=1 时n!= 1 当 N=0 时再将这种关系翻译为代码,即一个函数:long f(int n){ if (n==0) return(1); else return(n*f(n-1));}[步骤 4]完善程序 主要的递归函数已经完成,将程序依题意补充完整即可。//ex1.cpp#include long f(int n){ if (n==0) return(1); else return(n*f(n-1));}main(){ int n; cin>>n; cout<