A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ldk1991125 中级黑马   /  2016-6-22 11:48  /  1686 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

自学C语言中,昨天在基础视频上学到了递归函数的概述和构成条件。
其中,老师有讲到一个求岁数的问题,题目如下:
第一个人比第二个人大两岁,第二个人比第三个人大两岁,第三个人比第四个人大两岁,第四个人比第五个人大两岁,第五个人十岁,求第一个人的岁数?
程序如下:
#include <stdio.h>
int getAge(int n){
     int age;
     if(n==1){
     age=10;
   } else {
     age=getAge(n-1)+2;
  } return age;
}
int main(int argc,const char*argv[]){
     int age=getAge(5);
     printf("age=%d\n",age);
     return 0;
}
老师讲到,在函数的递推阶段,先后在压栈区堆积getAge(5),getAge(4),getAge(3),getAge(2),getAge(1)。
我的疑问如下:
在运算步骤中,if执行时,n=1的情况下,实际算式为10=getAge(0)+2,则此时停止压栈,并回归计算,依次出栈。那么,由于getAge(0)将直接计算得出数值8,此值是否会参与压栈?

3 个回复

倒序浏览
if(n==1){
     age=10;
   } else {
     age=getAge(n-1)+2;
  }
n == 1; 只执行 age = 10;
回复 使用道具 举报
FFFF001 发表于 2016-6-22 14:22
if(n==1){
     age=10;
   } else {

也就是说,在n==5时,执行age=getAge(4)+2
                  n==4时,执行age=getAge(3)+2
                  n==3时,执行age=getAge(2)+2
                  n==2时,执行age=getAge(1)+2
                  n==1时,直接执行age=10,同时结束堆栈。
返回计算的时候,age的值就直接赋值给了getAge(1)了?还是有其他的什么运算过程呢?
回复 使用道具 举报
ldk1991125 发表于 2016-6-22 14:49
也就是说,在n==5时,执行age=getAge(4)+2
                  n==4时,执行age=getAge(3)+2
         ...

堆完之后,回归计算,依次出栈
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马