C语言递归函数讲解
递归函数是什么?
是函数、、、、、、、、、、、、、、、、、、、、
你可以把它理解成是for循环与死循环的结合的函数。简单的说:递归函数是有条件终止的死循环函数;
死循环函数这里是指在函数体中调用自身;
举个列子:
用递归函数算出1*2*3*4*..........*n的值
int test_1(int n)
{
if(n==0) //终止递归函数的循环
retrun 1; //1*(最终值) = (最终值)
else
retrun test(n-1) *n; //调用自身,参数-1,得到值,最后会得到最终值
/*过程:
1. test(3)*4;
2. test(2)*3*4;
3. test(1)*2*3*4;
4. test(0)*1*2*3*4;
注意,这里——( 上面的test(0)又会重新进入test,此时retrun 1 )
所以步骤4实际上就是: 1*1*2*3*4;
实际上元素:1,2,3,4都是使用了的,所以最终值就是(1*2*3*4),而另外的一个1(test(0))只是让test函数不再循环下去的一个条件里面的语句;
也就是说在if里面可以返回任何值res,不一定只是返回1。但是必须满足res*1*2*3*4 = 1*2*3*4;这里的语句要根据4步骤来决定;
我们回看4步骤:test(0)*1*2*3*4——test(0)会进入if条件里面,也就终止调用自身,终止了函数循环,然后返回值是1
所以test(0)*1*2*3*4 = 1*1*2*3*4
*/
}
void main()
{
int res = test(4);
printf("值=%d\n",res);
}
以上就是递归函数;
递归函数逻辑思维要求比较高,有些企业面试的时候也会涉及这类问题;
我们可以看到这只是一个返回值为int 的递归函数,递归函数可不止这一种;
——还有递归函数操作数组,递归函数打印图案或者文字,递归函数甚至可以操作指针这些;
万变不离其宗,下面举一些例子:
// 1、给一个空的字符数组添加元素,(利用递归)
void homeWork_2(char a[],int n)
{
if(n==0)
printf("");
else{
a[n-1] =('a'+(n-1));
homeWork_2(a, n-1);
}
}
// 2、利用数组名进行传参,进行数组的求和。
int sum(int a[],int n){
if(n==0)
return 0;
else
return sum(a,n-1) + a[n-1];
}
int main(int argc, const char * argv[]) {
int arrs[7] = {1,2,3,4,5,6,7};
int res = sum(arrs, 7);
printf("数组和是:%d\n",res);
这里简单举了两个例子,递归函数一定要多去思考逻辑和多去敲代码;只要逻辑清晰,代码熟练,无论是操作整型,数组,指针等等都是一样的。
C语言递归函数讲解的更多相关文章
- 第二十四节:Java语言基础-讲解数组的综合应用
数组的综合应用 // 打印数组 public static void printArray(int[] arr) { for(int x=0;x<arr.length;x++) { if(x!= ...
- Go语言【第十三篇】:Go语言递归函数
Go语言递归函数 递归,就是在运行的过程中调用自己,语法格式如下: func recursion() { recursion() /* 函数调用自身 */ } func main() { recurs ...
- GO语言学习(二十)Go 语言递归函数
Go 语言递归函数 递归,就是在运行的过程中调用自己. 语法格式如下: func recursion() { recursion() /* 函数调用自身 */ } func main() { recu ...
- 传智播客C语言视频第二季(第一季基础上增加诸多C语言案例讲解,有效下载期为10.5-10.10关闭)
卷 backup 的文件夹 PATH 列表卷序列号为 00000025 D4A8:14B0J:.│ 1.txt│ c语言经典案例效果图示.doc│ ├─1传智播客_尹成_C语言从菜鸟到高手_第一 ...
- Go 语言递归函数
递归,就是在运行的过程中调用自己. 语法格式如下: func recursion() { recursion() /* 函数调用自身 */ } func main() { recursion() } ...
- c语言递归讲解分析
C语言允许函数调用它自己,这种调用的过程称为"递归(recursion)" 举例说明,如下代码: #include <stdio.h> void up_and_down ...
- Go语言之讲解GOROOT、GOPATH、GOBIN
Go是一门全新的静态类型开发语言,具有自动垃圾回收,丰富的内置类型,函数多返回值,错误处理,匿名函数,并发编程,反射等特性. go命令依赖一个重要的环境变量:$GOPATH GOPATH允许多个目录, ...
- return和exit以及C语言递归函数
return 在主函数main()中,return整个函数退出,在子函数中return,只退出子函数. exit exit无论在函数什么位置退出整个函数 递归函数 #include <stdio ...
- C语言双向链表讲解
一.双向链表的概念 双向链表基于单链表.单链表是单向的,有一个头结点,一个尾结点,要访问任何结点,都必须知道头结点,不能逆着进行.而双链表添加了一个指针域,通过两个指针域,分别指向结点的前结点和后结点 ...
随机推荐
- C++常见的概念
1)多态:允许将子类类型的指针赋值给父类类型的指针.赋值以后,父类对象可以根据当前赋值给它的子类对象的特性以不同的方式运作. 2)深拷贝:重新分配内存:浅拷贝:共用同一内存. 3)友元:非成员函数不能 ...
- C# 比较两个路径是否指向同一对象
string path1 = @"c:\test\rootpath"; string path2 = @"C:\TEST\..\TEST\ROOTPATH"; ...
- Keepalived+LVS实现高可用负载均衡双主模式
LVS是一种集群(Cluster)技术:采用IP负载均衡技术和基于内容请求分发技术.调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一 ...
- YAML 知识点
YAML:Ain't Markup Language 的缩写 YAML文件定义了一系列带有约束说明的任务,这些任务都是以任务名开始并且至少要包含script部分. 任务是由Runners接管并且由服务 ...
- php正则判断是否同时有数字和字母
1.php正则判断是否同时有数字和字母$subject = 'qq2';var_dump(preg_match('/^(?![0-9]+$)(?![a-zA-Z]+$)/', $subject)); ...
- unittest 出报告 并配合 jenkins,发现有用例错误,但是构建没出现红点 的解决方法
加了个 判断 测试用例总数 和 测试运行成功数 是否一致的判断,不一致 就断言失败,jenkins哪里是红点
- C++Primer第五版——习题答案详解(一)
习题答案目录:https://www.cnblogs.com/Mered1th/p/10485695.html 第1章 开始&&第2章 变量和基本类型 练习1.3 #include&l ...
- [UE4]Native Widget Host
一.Native Widget Host是一个容器,它可以包含一个Slate UI 二.Native Widget Host应该用在当你需要把一个Slate UI 放到UMG中的时候,只有这个时候才需 ...
- 《Celeste》 开发者是如何精心制作“冲刺”的
转自:http://www.gameres.com/804804.html 简介与序曲 在Celesete里,许多细微的行动都是发生在转瞬之间的,甚至往往比你想象中还要“转瞬之间”. 这里是 [游戏机 ...
- wps表格开发C#
1.需要添加引用etapi.dll,这个dll在你的wps的安装目录下面可以找到. 2.主要的类: Excel.Application:顶层对象 WorkBook:工作簿 WorkSheet:表 Ra ...