第04章 方法与递归
- 格式:ppt
- 大小:84.50 KB
- 文档页数:16


递归方法
递归方法。
递归是一种常见的算法思想,它在计算机科学中扮演着重要的角色。递归方法是指一个函数在执行过程中调用自身的方法,通过不断地调用自身来解决问题。在本文中,我们将深入探讨递归方法的原理、应用和注意事项。
首先,让我们来了解一下递归方法的原理。递归方法通常包括两部分,基线条件和递归条件。基线条件是指在递归过程中能够直接得到结果的条件,通常是一个简单的情况,不再需要继续递归。递归条件则是指在递归过程中调用自身的条件,通过不断地调用自身来缩小问题的规模,直到达到基线条件为止。
递归方法可以应用在各种问题中,例如数学计算、数据结构、算法等领域。在数学计算中,递归方法常常用于计算阶乘、斐波那契数列等。在数据结构和算法中,递归方法可以用来实现树的遍历、图的搜索等操作。通过递归方法,我们可以简洁地解决许多复杂的问题,提高代码的可读性和可维护性。
然而,使用递归方法时需要注意一些问题。首先,递归方法可能会导致栈溢出的问题,因为每次递归调用都会在内存中创建一个新的栈帧,当递归层级过深时,可能会导致栈溢出。其次,递归方法的效率通常较低,因为每次递归调用都需要保存当前的状态并创建新的栈帧,消耗了大量的内存和时间。因此,在实际应用中,需要谨慎使用递归方法,可以考虑使用迭代方法或动态规划来替代递归方法,以提高程序的效率。
总之,递归方法是一种重要的算法思想,它可以帮助我们解决许多复杂的问题。通过深入理解递归方法的原理和应用,我们可以更好地应用递归方法来解决实际问题,并且在实际应用中需要注意递归方法可能导致的问题,以及如何优化递归方法的效率。希望本文能够帮助读者更好地理解和应用递归方法。
递归方程解的渐近阶的求法
递归算法在最坏情况下的时间复杂性渐近阶的分析,都转化为求相应的一个递归方程的解的渐近阶。因此,求递归方程的解的渐近阶是对递归算法进行分析的关键步骤。
递归方程的形式多种多样,求其解的渐近阶的方法也多种多样。这里只介绍比较实用的五种方法。
1. 代入法 这个方法的基本步骤是先推测递归方程的显式解,然后用数学归纳法证明这一推测的正确性。那么,显式解的渐近阶即为所求。
2. 迭代法 这个方法的基本步骤是通过反复迭代,将递归方程的右端变换成一个级数,然后求级数的和,再估计和的渐近阶;或者,不求级数的和而直接估计级数的渐近阶,从而达到对递归方程解的渐近阶的估计。
3. 套用公式法 这个方法针对形如:T (n)=aT (n / b)+f (n) 的递归方程,给出三种情况下方程解的渐近阶的三个相应估计公式供套用。
4. 差分方程法 有些递归方程可以看成一个差分方程,因而可以用解差分方程(初值问题)的方法来解递归方程。然后对得到的解作渐近阶的估计。
5. 母函数法 这是一个有广泛适用性的方法。它不仅可以用来求解线性常系数高阶齐次和非齐次的递归方程,而且可以用来求解线性变系数高阶齐次和非齐次的递归方程,甚至可以用来求解非线性递归方程。方法的基本思想是设定递归方程解的母函数,努力建立一个关于母函数的可解方程,将其解出,然后返回递归方程的解。
本章将逐一地介绍上述五种方法,并分别举例加以说明。
本来,递归方程都带有初始条件,为了简明起见,我们在下面的讨论中略去这些初始条件。
递归方程组解的渐进阶的求法——代入法
用这个办法既可估计上界也可估计下界。如前面所指出,方法的关键步骤在于预先对解答作出推测,然后用数学归纳法证明推测的正确性。
例如,我们要估计T(n)的上界,T(n)满足递归方程:
其中是地板(floors)函数的记号,表示不大于n的最大整数。
我们推测T(n)=O(nlog n),即推测存在正的常数C和自然数n0,使得当n≥n0时有: T(n)≤Cnlog n (6.2)
C语言用递归方法求n的阶乘
介绍
在计算机编程中,递归是一种非常常用的技巧和思维方式。递归是指在函数的定义中使用函数本身。
本篇文章将深入探讨如何使用递归方法求解n的阶乘,其中n是一个非负整数。
什么是阶乘
阶乘是一个非常基础的数学运算,表示从1到给定的数字n之间的所有整数的乘积。
例如,5的阶乘表示为5!,计算过程如下:
5! = 5 × 4 × 3 × 2 × 1 = 120
可以看出,阶乘是一个逐渐减小的过程,直到最后乘到1为止。
递归方法求n的阶乘
递归方法是一种将一个问题分解为更小规模的子问题,并通过解决子问题来解决原始问题的方法。
用递归方法求解n的阶乘,可以将问题分解为计算n与(n-1)的阶乘的乘积。具体的递归求解阶乘的C语言代码如下所示:
#include
unsigned long long factorial(unsigned int n) {
if (n <= 1) {
return 1;
} else {
return n * factorial(n - 1);
}
}
int main() {
unsigned int n = 5;
unsigned long long result = factorial(n); printf("The factorial of %d is %llu\n", n, result);
return 0;
}
在上述代码中,我们定义了一个名为factorial的递归函数,用于计算n的阶乘。如果n小于等于1,那么阶乘的结果就是1;否则,我们通过调用函数本身来计算(n-1)的阶乘,并将其乘以n,从而得到n的阶乘。在main函数中,我们给定了一个示例值n=5,并输出计算结果。
递归方法的工作原理
递归方法的核心思想是将一个大问题分解为一个或多个规模更小的子问题。在本例中,我们将计算n的阶乘的问题分解为计算(n-1)的阶乘的问题,直到将问题进一步简化为计算1的阶乘的问题。
1 递归及其实现
递归是程序设计中最常用的方法之一,许多程序设计语言都提供递归调用的功能。有些
问题用递归方法求解往往使程序非常简单清晰。栈在实现递归调用中起了关键作用。
一个直接调用自己或通过一系到的调用语句间接地调用自己的函数,称做递归函数。直
接调用自己的函数称做直接递归函数。间接调用自己的函数称做间接递归函数。
有很多数学函数是递归定义的。例如阶乘函数的递归定义是
1 若n=0
Fact(n)=
n×Fact(n-1) 若n>0
又例如,Fibonacci(斐波那契)数列可递归定义为
0 若n=0
Fib(n) = 1 若n=1
Fib(n-1)+Fib(n-2) 若n>1
据此可以写出实现求n 的阶乘和求Fibonacci数列中第n项的递归算法,如算法21和
算法22所示。
long int fact(int n){ //求非负整数n的阶乘
if(!n) return 1; //0!=1 else return n*fact(n-1); //n!=n*(n-1)! }//fact
算法21 求阶乘的递归算法
long int fib(int n){ //求斐波那契数列中的第n个数
if(n<2) return n; //f(0)=0,f(1)=1