有时候会因为不注意递归函数中局部变量和全局变量,而导致结果和我们期望的不一致,递归中,在递归中的局部变量和全局变量,可以类似的看成函数调用时传递方式的按值传递(局部变量)和引用传递(全局变量)
局部变量:可以看成两个值,即虽然名字相同,但每次递归时是重新创建的变量,不会覆盖掉上次创建的值;(类似形参与实参不同)
全局变量:每一次对于全局变量进行操作,就会改变它的值。
看下面两个简单的程序,看它们的运行结果

程序一:

#include <stdio.h>
void f()
{char x;scanf("%c",&x);if(x=='*'){printf("%c",x);}else{f();printf("%c",x);}return;
}
int main()
{f();return 0;
}
输入样例

abc*

输出样例

*cba

程序2:

#include <stdio.h>
char x;
void f()
{scanf("%c",&x);if(x=='*'){printf("%c",x);}else{f();printf("%c",x);}return;
}
int main()
{f();return 0;
}
输入样例

abc*

输出样例

由上面两个程序可以看出,它们定义的变量是不一样的,第一个函数的变量x是局部变量,而第二个程序的变量x是全局变量,这就导致了它们的输出结果不一样。

分析程序1


上面是进入函数f( )后的运行过程,刚开始输入x=a,if为假,再次调用f( )函数,再次输入x=b,以此类推下去,到最后if为真时,输出x= *,再返回输出x=c,以此类推下去,最后的到的结果是 *cba。

而由于变量x是局部变量,存放在内存的栈区,属于动态存储类别, 占动态存储区空间,函数调用结束后自动释放。
如:看上面的流程图1,当第⑤执行后,则第四个框内的数据都会被系统回收,x的值就看第三个框,变为c,以此下去,直到结束。所以最后的结果并不会跟程序2的结果一样输出****。

分析程序2


程序2中的自定义函数f( )与程序1的执行过程差不多,只是变量x变成了全局变量。全局变量存放在内存中的静态区,在该区的数据只有在程序全部执行完之后才会被释放。

看上面的流程图2,x是全局变量,所以x放在了静态区里面,每次激活函数f( )后,输入的x的值会覆盖前一个x的值,当程序执行到第⑤步执行后,x的值并不会像程序1那样被系统回收,它会保留下来,当函数进入第三个框内的时候,输出的x依然是*,以此推下去。因此,程序会输出****。

递归函数中局部变量和全局变量相关推荐

  1. A13在c语言中是合法变量吗,C语言中局部变量和全局变量等在内存中的存放位置.doc-资源下载在线文库www.lddoc.cn...

    C语言中局部变量和全局变量_等在内存中的存放位置.doc C 语言中局部变量和全局变量 变量的存储类别static,extern,auto,register 8.8 局部变量和全局变量在讨论函数的形参 ...

  2. C语言中局部变量和全局变量 变量的存储类别

    C语言中局部变量和全局变量 变量的存储类别(static,extern,auto,register)   局部变量和全局变量 在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用 ...

  3. Python中局部变量和全局变量的详解

    1.局部变量 定义: 局部变量,就是在函数内部定义的变量 约束: 其作用范围是这个函数内部,即只能在这个函数中使用,在函数的外部是不能使用的 实例: def test1():a = 120print( ...

  4. php中局部变量和全局变量

    局部变量:在函数内部中定义的变量,它的作用域为函数定义范围内. 全局变量:在函数外部定义的变量,它的作用域从定义处一直到文件结尾. 全局变量的值不能在局部变量函数里面显示,局部变量的值也不能在全局变量 ...

  5. C语言学习Day23 递归函数、局部变量、全局变量

    23-1 /*1.函数定义返回类型 函数名(参数列表){函数体; } 形参:作用用来接收外部传来的数据注意:自定义函数和main函数是平行关系,不嵌套定义 1.返回类型 int double char ...

  6. T-SQL语言中局部变量(@)和全局变量(@@)

    局部变量和全局变量 T-SQL局部变量 局部变量的作用范围仅限制在程序内部.***局部变量被引用时要在其名称前加上标志"@",***而且必须先用DECLARE命令定义后才可以使用. ...

  7. python中局部变量和全局变量

    局部变量,就是在函数内部定义的变量 不同的函数,可以定义相同的名字的局部变量,但是各用个的不会产生影响 局部变量的作用,为了临时保存数据需要在函数 在函数外边定义的变量叫做全局变量 全局变量能够在所有 ...

  8. C++中局部变量和全局变量的存储位置和内存回收机制

    局部变量,参数变量存放在栈中,当离开作用范围后,分配的内存在作用范围外会被系统自动回收. 切记!不要使用局部变量的指针和引用! 在函数结束后,局部变量被释放后,指针和引用可能在短时间内可以使用,也可能 ...

  9. php局部全局变量,PHP局部变量与全局变量

    一.局部变量 定义:在函数内部声明,且只能在函数内部调用的变量. 注意:参数也是局部变量的一种. demo1: 1 function demo1(){ 2     $age = 10; 3 } 4 5 ...

最新文章

  1. Linux下CMake简明教程(八) 添加编译选项
  2. linux批量管理教程,Linux批量文件管理
  3. PaddleOCR——CUDA9.0环境中训练运行错误【Cudnn error, CUDNN_STATUS_BAD_PARAM】解决方案
  4. 2018年 第9届 蓝桥杯 Java B组 省赛真题详解及总结
  5. 打印页面横向怎么设置_条码打印软件标签纸页面设置的方法
  6. 【MFC】对话框中创建工具栏
  7. HDU - 3746 Cyclic Nacklace(KMP的next数组判循环节)
  8. Redis 5.0 正式版发布了,19 个新特性
  9. 奥运转播加速上云,北京冬奥组委测试阿里云视频传输技术
  10. Linux下MySQL server和client安装
  11. eclipse——Error exists in required project Proceed with launch?
  12. 多个点 最远距离 java_Java实现的计算最大下标距离算法示例
  13. Microsoft Windows XP Embedded 技术常见问题
  14. Linux安装WIFI无线网卡驱动
  15. 解决Symantec卸载需要密码问题又一新招
  16. 数字电路——流水灯(二)_往返流水灯
  17. 【seeprettyface.com】开源源码:萌娃脸生成器
  18. 共享扫码娃娃机无现金化扫码支付
  19. TencentOS-tiny 时间管理(十 六)- 时间片轮转机制
  20. 密码学实验-RSA算法的几种攻击方法的实现

热门文章

  1. C语言试题三之计算并输出 s=1+(1+2^(0.5))+(1+2^(0.5)+3^(0.5))+…+(1+2^(0.5)+3^(0.5)+…+n^(0.5))
  2. linux c之出现warning: implicit declaration of function ‘exit’ [-Wimplicit-function-declaration]这个问题
  3. 链表之单链表约瑟夫问题(一)
  4. python用户输入若干个分数_编写一个程序,要求用户输入五个测试分数。与字母grad对应...
  5. 女朋友在家是怎么利用我的模型的​
  6. 史上最丧心病狂的商品定价套路:如何从数学角度,榨干你身上的每一分钱
  7. 震惊!原来现在无所不能的世界主人翁,早已在三千年前就悄然出现!
  8. 快速掌握MATLAB应用,从这一步开始
  9. 百度内部培训PPT流出:数据分析的道与术
  10. git checkout 单个文件_git 如何回退单个文件