递归
2014-05-11 17:04
204 查看
【1】
#include "stdio.h"
#include "windows.h"
/*
递归调用执行过程:
递归函数调用之前代码(函数的调入):
每次进入都会执行一遍(调用函数后面的都不执行),直到不满足某个条件而退出。
递归函数调用之后代码(函数的返回):
每次退出时执行一遍(调用函数前面的都不再执行)。
传入的参数即局部变量(调用前对参数的访问顺序如54321),将全部存在栈中
最后返回时就像出队的过程(先入先出如12345)
*/
#include "stdio.h"
int g_num;
void up_down(int n)
{
printf("call-n=%d: n-addr=0x%x\n",n,&n);
if (n <g_num)
{
up_down(n+1);
}
printf("return-n=%d: n-addr=0x%x\n",n,&n);
}
/*
注意函数参数是存在栈中的;
首先入栈操作:
n=1先入栈
n=2再入栈
n=3再入栈
当n=3时候不满足条件了接着函数进行出栈操作:
依次打印3, 2, 1
结果:
call-n=1: n-addr=0x18fef8
call-n=2: n-addr=0x18fea0
call-n=3: n-addr=0x18fe48
return-n=3: n-addr=0x18fe48
return-n=2: n-addr=0x18fea0
return-n=1: n-addr=0x18fef8
*/
int main()
{
g_num = 3;
up_down(1);
return 0;
}
------------------------------------------------------------------------------------------------------------------------------
【2】???
局部变量n入栈
n=3 e(2)
n=2 e(1)
n=1 e(0)
n=0 不执行了,接着出栈操作
局部变量n出栈
n=1 e(0) 打印0 n=-1不执行
n=2 e(1) 打印1 n=0不执行···
n=3 e(2) 打印2 n=1打印0
【3】浅析全局变量和局部变量
代码:
/***********************************************************************/
结果:
m1=2 m2=7 m3=4 m4=0
20
/***********************************************************************/
解析:
我们知道递归操作即是把【函数的参数以及局部变量】先依次入栈再依次从底出栈。
【记住:可不是全局和静态的变量啊,全局和静态的变量是共享的啊】
代码分析:
#include "stdio.h"
#include "windows.h"
/*
递归调用执行过程:
递归函数调用之前代码(函数的调入):
每次进入都会执行一遍(调用函数后面的都不执行),直到不满足某个条件而退出。
递归函数调用之后代码(函数的返回):
每次退出时执行一遍(调用函数前面的都不再执行)。
传入的参数即局部变量(调用前对参数的访问顺序如54321),将全部存在栈中
最后返回时就像出队的过程(先入先出如12345)
*/
#include "stdio.h"
int g_num;
void up_down(int n)
{
printf("call-n=%d: n-addr=0x%x\n",n,&n);
if (n <g_num)
{
up_down(n+1);
}
printf("return-n=%d: n-addr=0x%x\n",n,&n);
}
/*
注意函数参数是存在栈中的;
首先入栈操作:
n=1先入栈
n=2再入栈
n=3再入栈
当n=3时候不满足条件了接着函数进行出栈操作:
依次打印3, 2, 1
结果:
call-n=1: n-addr=0x18fef8
call-n=2: n-addr=0x18fea0
call-n=3: n-addr=0x18fe48
return-n=3: n-addr=0x18fe48
return-n=2: n-addr=0x18fea0
return-n=1: n-addr=0x18fef8
*/
int main()
{
g_num = 3;
up_down(1);
return 0;
}
------------------------------------------------------------------------------------------------------------------------------
【2】???
#include<stdio.h> void e(int ); main() { inta; a=3; e(a); } void e(int n) { if(n>0) { e(--n); printf("%d\n",n); e(--n); } }
局部变量n入栈
n=3 e(2)
n=2 e(1)
n=1 e(0)
n=0 不执行了,接着出栈操作
局部变量n出栈
n=1 e(0) 打印0 n=-1不执行
n=2 e(1) 打印1 n=0不执行···
n=3 e(2) 打印2 n=1打印0
【3】浅析全局变量和局部变量
代码:
/***********************************************************************/
#include<stdio.h> int m3 = 1; int fun( int m4) { int m1 = 1; static int m2 = 1; m1++; m2++; m3++; if(m4 <= 0) { printf("m1=%d m2=%d m3=%d m4=%d \n",m1, m2, m3,m4); return 5; } else return m4 + fun(m4 -1); } int main() { int m5 = fun(5); printf("%d\n",m5); }
结果:
m1=2 m2=7 m3=4 m4=0
20
/***********************************************************************/
解析:
我们知道递归操作即是把【函数的参数以及局部变量】先依次入栈再依次从底出栈。
【记住:可不是全局和静态的变量啊,全局和静态的变量是共享的啊】
代码分析:
相关文章推荐
- 如何将视差数据保存为 txt 数据文件以便在 Matlab 中读取分析?
- c++11 中auto 相当方便
- 电脑硬盘分区为何从C盘开始?A和B盘呢?
- 数据结构 树(二叉树 链式存储)
- 对象数组操作长方柱类
- C27_OC17-日期类型NSDate
- .net 错误处理
- hash poj_1200 Crazy Search
- 20140511 科技脉搏 -中国互联网正在全面接管中国经济?
- eclipse安装Flash Builder 4后变成中文,怎么解决
- Leetcode 树 Same Tree
- linux下的基本命令
- 命令行执行python模块时提示包找不到的问题
- C26_OC16-OC类型包装
- 小总结
- 不容易系列之(4)——考新郎 杭电 acm 2049 Java
- iftop和iostat安装和简单使用
- 0012-APK-Activity-Wallpaper
- Android文件系统的结构及目录用途、操作方法
- 顺序栈的c语言实现(程序可运行)。。。2014.5.11