学习笔记----递归函数
2016-01-15 15:39
246 查看
递归函数:
递归的基本原理:
1 每一次函数调用都会有一次返回.当程序流执行到某一级递归的结尾处时,它会转移到前一级递归继续执行.
2 递归函数中,位于递归调用前的语句和各级被调函数具有相同的顺序.
3 每一级的函数调用都有自己的私有变量.
4 递归函数中,位于递归调用语句后的语句的执行顺序和各个被调用函数的顺序相反.
5 虽然每一级递归有自己的变量,但是函数代码并不会得到复制.
6 递归函数中必须包含可以终止递归调用的语句.
例如:
//void fun(int num)
1 实现任意进制之间转换(递归)
或
4
递归的基本原理:
1 每一次函数调用都会有一次返回.当程序流执行到某一级递归的结尾处时,它会转移到前一级递归继续执行.
2 递归函数中,位于递归调用前的语句和各级被调函数具有相同的顺序.
3 每一级的函数调用都有自己的私有变量.
4 递归函数中,位于递归调用语句后的语句的执行顺序和各个被调用函数的顺序相反.
5 虽然每一级递归有自己的变量,但是函数代码并不会得到复制.
6 递归函数中必须包含可以终止递归调用的语句.
例如:
//void fun(int num)
//{ // if (num > 0) // { // fun(num/2); // } // printf("%d\n", num); //} //递归函数展开过程 void fun(int num) { if (num > 0) { //fun(num / 2); if (num / 2 > 0) { if (num / 4 > 0) { if (num / 8 > 0) { if (num / 16 > 0) { } printf("%d\n", num); } printf("%d\n", num); } printf("%d\n", num); } printf("%d\n", num); } printf("%d\n", num); }
1 实现任意进制之间转换(递归)
//使用递归函数实现 2~16 进制的转换,只能处理正数 void scaleSwitch(int num, int value) { if (num == 0) return; //printf("push: %d ", num); // 压栈 scaleSwitch(num / value, value); putchar(buf[num % value]); //printf("pop: %d ", num); // 弹栈 }
或
char *newScaleSwitch(int num, int bit) { //定义静态变量的目的:为了在多层递归里面使用的是同一个值,且static只执行一次 static char cArry[128] = ""; static int i = 0; //递归退出条件 if (num == 0) { //cArry[i] = '0'; return 0; } //对于负数的预处理 if (num < 0) { cArry[i] = '-'; ++i; num = -num; } //正整数递归,进行进制转换. if (num != 0) { newScaleSwitch(num/bit, bit); //递归入栈 cArry[i++] = buf[num % bit]; //递归弹栈 //putchar(buf[num % bit]); //putchar(buf[i++]); } return cArry; }或
void test(int num, int bit) { if (num == 0) { //putchar('0'); return; } if (num < 0) { putchar('-'); num = -num; } if (num != 0) { test(num/bit, bit); putchar(buf[num%bit]); } }
4
<span style="color:#0000ff;">//走阶梯 共有h个台阶,每一步有3种走法:走1个台阶;走2个台阶;走3个台阶.问可走多少种方案? </span>void goStep(int num) { static int stepNum = 0; static int step[128]; static int count = 1; int i; if (num == 0) { printf("第%d种走法共走了%d步: ", count++, stepNum); for (i = 0; i < stepNum; ++i) { printf("%d ", step[i]); } putchar(10); } if (num >= 1) { step[stepNum++] = 1; goStep(num-1); stepNum--; } if (num >= 2) { step[stepNum++] = 2; goStep(num - 2); stepNum--; } if (num >= 3) { step[stepNum++] = 3; goStep(num - 3); stepNum--; } } int goStep2(int num) { //if (num == 0) // return 0; if (num == 1) return 1; if (num == 2) { return 2; } if (num == 3) return 4; else return (goStep2(num - 1) + goStep2(num - 2) + goStep2(num - 3)); }<span style="color:#0000ff;"> </span>
相关文章推荐
- Android中Activity执行restart过程中涉及到的四种数据存储恢复的方法
- nginx配置location总结及rewrite规则写法
- AppStore发布详解(全,可用)
- Generative Model 与 Discriminative Model(二)
- 什么是PHD?
- 纯代码构建tabbar
- C# 上传图片前判断上传图片的宽和高
- IOS App打包发布流程(公司账号)
- mysql服务性能优化—my.cnf配置说明详解(16G内存)
- 破解游戏的反调试
- Java中的简单工厂模式
- Android持久化技术之SharedPreferences存储实例详解
- MTK andorid从底层到上层添加驱动
- UILabel自动调整大小(高度,宽度)
- ECharts3进行中
- spring mvc打印信息
- java实现HDFS上的压缩文件的解压
- opencv中Mat里面depth,dims,channels,step,data,elemSize和数据地址计算的理解 (转)
- EF 增删改查
- nginx upstream的几种配置方式