C语言-递推递归
- 格式:ppt
- 大小:752.50 KB
- 文档页数:47
C语言递归函数C语言是一种非常重要的编程语言,递归函数是C语言中的一个重要概念。
本文将详细介绍C语言递归函数的定义、实现以及递归函数的优缺点。
1. 递归函数的定义在C语言中,递归函数是指在函数内部调用自身的函数。
递归函数通常包含一个或多个基准情况(递归终止条件),在满足基准情况之前,递归函数会不断调用自身来解决更小规模的问题。
2. 递归函数的实现为了实现递归函数,我们需要考虑两个重要的要素:基准情况和递归关系。
2.1 基准情况在编写递归函数时,必须确定递归终止条件。
这个条件通常是问题规模足够小,可以直接得出答案的情况。
通过设置基准情况,可以避免递归函数陷入无限循环,导致程序崩溃。
2.2 递归关系递归关系指的是将原始问题拆分为更小规模的子问题,并且这些子问题与原问题的解具有相同的结构。
递归函数通过调用自身来解决子问题,将子问题的解合并为原问题的解。
递归关系的正确定义是确保递归函数能够有效地解决问题的关键。
3. 递归函数的示例下面是一个计算斐波那契数列的递归函数的示例:```c#include <stdio.h>int fibonacci(int n){if(n <= 1) // 基准情况return n;else // 递归关系return fibonacci(n-1) + fibonacci(n-2);}int main(){int n = 10;int result = fibonacci(n);printf("斐波那契数列的第%d项为%d\n", n, result); return 0;}```在以上示例中,递归函数fibonacci计算了斐波那契数列的第n项。
当n小于等于1时,即为基准情况,直接返回n。
否则,递归调用fibonacci函数计算第n-1和第n-2项,并将结果相加返回。
4. 递归函数的优缺点递归函数具有以下优点:- 可以简化代码实现,使代码更加简洁易读。
HDU2046⾻牌铺⽅格递推C语⾔
题⽬:
知道应该⽤递归递推来做,但是⼀直找不到规律……拖了好久,终于决定今天做完。
苦思⽆果搜题解,发现代码只有⼏⾏…… 递推递归果然神奇啊
思路:f(1)=1,f(2)=2,f(3)=5,当有n个⽅格的时候,有两种铺法:
1)先铺好n-1个格,有f(n-1)个⽅法,再铺第n层的时候只有⼀种⽅法,所以总⽅法是1*f(n-1);
2)先铺好n-2格,有f(n-2)个⽅法,再铺后⾯两层的时候只能两个都横着铺(否则与第⼀种情况重复),所以也只有⼀种情况,总⽅法数是1*f(n-2)
再没有其他情况了。
推出f(n)=f(n-1)+f(n-2)
提交情况: 2次TLE,两次WA
AC code:
View Code
1#include <stdio.h>
2#include <stdlib.h>
3int main () {
4int n;
5int i;
6 __int64 a[60] = {0, 1, 2};
7for (i = 3; i <= 51; i++)
8 a[i] = a[i - 1] + a[i - 2];
9while (~scanf ("%d", &n))
10 printf ("%I64d\n", a[n]);
11//system ("pause");
12return0;
13}
先开始写了⼀个⼦函数递归,于是超时了,改⽤数组写,a[n]开成了int型,溢出了,于是WA了……
这种找规律的题还是要多多练习才⾏啊!。
递归函数是一种特殊的函数,它调用自身来解决问题。
在C语言中,递归函数可以通过以下方式实现:
1. 定义一个函数,该函数返回一个值,或者没有返回值(void)。
2. 在函数的函数体中,使用return语句或break语句来结束函数的执行。
3. 在函数的函数体中,调用自身,将问题的规模减小,直到问题能够直接解决为止。
下面是一个简单的递归函数示例,该函数计算一个数的阶乘:
```c
#include <stdio.h>
int factorial(int n) {
if (n == 0) {
return 1;
} else {
return n * factorial(n - 1);
}
}
int main() {
int n = 5;
int result = factorial(n);
printf("%d! = %d\n", n, result);
return 0;
}
```
在上面的代码中,factorial()函数是一个递归函数。
当n等于0时,函数返回1。
否则,函数返回n乘以factorial(n-1)的结果。
在main()函数中,我们调用factorial()函数来计算5的阶乘,并将结果打印到控制台上。
C语言递归递归是一种常见的编程技术,也是C语言中的一种重要的编程方法。
递归是指函数通过自身调用来解决问题的一种方式。
在递归中,函数会重复调用自己,并且每次调用都会解决问题的一部分,直到最终问题被解决。
递归算法递归算法的核心思想是将问题分解成若干个与原问题相似的子问题,并递归地解决这些子问题。
通过最终得出每个子问题的解,再逐步合并,最终得出原问题的解。
递归算法的基本流程如下:递归的优劣递归算法具有可读性好、思路清晰、代码简洁等优点,但是在实现过程中,递归的性能有时会受到限制。
递归算法在运行时会不断地创建新的栈帧,这会占用大量的内存空间,如果递归深度过高,会导致栈溢出的问题。
递归函数中的 STACK OVERFLOW问题:在将递归算法实现时,必须注意递归的深度,否则就会出现STACK OVERFLOW问题。
递归的应用递归算法在很多算法中都有广泛的应用,例如——1.排序算法快速排序、归并排序、堆排序等排序算法中都有递归的应用。
2.搜索算法深度优先搜索和广度优先搜索等搜索算法中都有递归的应用。
3.数学计算递归算法经常用于解决复杂的数学计算问题。
实例以下是一个简单的递归函数例子,函数将返回从1到输入参数 n 的和。
以上代码中,函数 sum 通过递归的方式计算从1到 n 的和。
当 n 的值等于1时,函数返回1,否则函数返回n加上sum(n-1)的值。
```csum:55```输出结果为55,证明递归函数成功地计算出了从1到10之间的所有数字的和。
总结递归是一种非常有用的编程技术,可以帮助我们在编写程序时处理一些复杂的问题。
递归算法的核心思想是将问题分解成若干个与原问题相似的子问题,并通过递归的方式解决它们。
在递归过程中,我们必须注意避免栈溢出等问题,以确保程序能够正常运行。
递推和递归方法在C语言程序设计中的应用作者:张春燕沈漪来源:《软件导刊》2013年第03期摘要:递推和递归问题是计算机高级语言程序设计课程中的重点和难点问题。
以卖票问题为例,对递推和递归方法进行了探讨,并通过C程序进行了验证。
关键词:递推;递归;C程序中图分类号:TP311.5 文献标识码:A 文章编号:16727800(2013)003005701作者简介:张春燕(1982-),女,硕士,无锡科技职业学院讲师,研究方向为数据库开发、算法设计。
1 递归和递推算法递归作为一种算法在程序设计语言中广泛应用。
它是调用一个函数的过程中又出现直接或者间接地调用该函数本身。
递归是计算机科学的一个重要概念,递归的方法是程序设计中有效的方法,采用递归编写程序能使程序变得简洁和清晰。
递推算法是一种用若干步可重复的简运算(规律)来描述复杂问题的方法。
递推是序列计算机中的一种常用算法。
递推法的特点是从一个已知的事实出发,按照一定规律推出下一个事实,再从这个新的已知事实出发,再向下推出一个新的事实。
2 问题提出一场球赛开始前,售票工作正在紧张进行中,每张球票为50元,现有m+n个人排队等待购票,其中有m个人手持50元的钞票,另外n个人手持100元的钞票。
假设开始售票时售票处没有零钱,求出这m+n个人排队购票,使售票处不至出现找不开钱的局面的不同排队种数(这里正整数m、n从键盘输入)。
这个问题用一般的解决方法非常麻烦,下面用递归和递推方法解决。
3 购票问题分析这是一道组合计数问题。
令f(m,n)表示有m个人手持50元的钞票,n个人手持100元的钞票时共有的方案总数。
(1) n=0。
n=0意味着排队购票的所有人手中拿的都是50元的钞票,那么这m个人的排队总数为1,即f(m,0)=1。
(2) m (3)其它情况。
m+n个人排队购票,第m+n个人站在第m+n-1个人的后面,则第m+n个人的排队方式可由两种情况获得:①第m+n个人手持100元的钞票,则在他之前的m+n-1个人中有m个人手持50元的钞票,有n-1个人手持100元的钞票,此种情况共有f (m,n-1);②第m+n个人手持50元的钞票,则在他之前的m+n-1个人中有m-1个人手持50元的钞票,有n个人手持100元的钞票,此种情况共有f(m-1,n)。
C语言中的递归函数与应用实例递归是一种重要的编程技术,它在 C 语言中被广泛应用。
递归函数指的是在函数的定义中调用自身的函数。
本文将详细介绍 C 语言中的递归函数的概念、用法以及应用实例。
一、递归函数的概念与特点递归函数是指函数在其定义中直接或间接地调用自身的函数。
递归函数具有以下重要特点:1. 自我调用:递归函数能够在函数体内调用自身。
2. 结束条件:递归函数必须包含一个或多个终止条件,以避免无限循环调用。
3. 逐层推进:递归函数通过不断调用自身并向基本情况靠近,逐层迭代解决问题。
二、递归函数的基本形式在 C 语言中,递归函数的基本形式如下:```c返回类型函数名(参数列表) {if (终止条件) {// 返回终止条件的结果} else {// 递归调用自身,并处理返回的结果}}```三、递归函数的应用实例下面是几个常见的递归函数实例,展示了递归在不同问题中的应用。
1. 计算阶乘阶乘是一个常见的数学运算,表示从 1 至某个正整数的连续乘积。
在 C 语言中,可以使用递归函数来计算阶乘,如下所示:```cint factorial(int n) {if (n == 0) {return 1;} else {return n * factorial(n - 1);}}```该递归函数通过不断将问题规模缩小,直至达到终止条件,然后逐层返回结果,最终得到阶乘的值。
2. 斐波那契数列斐波那契数列是一个常见的数列,其特点是每个数恰好是前两个数的和。
我们可以使用递归函数来生成斐波那契数列,如下所示:```cint fibonacci(int n) {if (n == 0 || n == 1) {return n;} else {return fibonacci(n - 1) + fibonacci(n - 2);}}```该递归函数通过逐层迭代调用自身,不断将问题规模缩小,最终计算得到第 n 个斐波那契数。
3. 遍历目录在文件系统中,我们经常需要遍历目录中的文件和子目录。