求高手解答C++入门问题!!!

例1:longa=0,b=1;P1:a++;b*=a;if(a<10)gotoP1;longc=b;结果c的值为10的阶乘问题1:我的理解是第一次执行,a为0,c输出0;... 例1:
long a = 0, b = 1;
P1:
a++;
b *= a;
if( a < 10 )
goto P1;
long c = b;
结果c的值为10的阶乘
问题1:我的理解是第一次执行,a为0,c输出0;第二次执行,a为1,c输出1依次类推,最后的结果是
0 1 2 3 4 5 6 7 8 9 10,而不是10的阶乘,请问我哪里理解错了
例2:
long AB( long x )
{
If
( x > 1 ) return x * AB( x - 1 );
Else
return 1;
}
如果long c = AB( 5 );,则c为5的阶乘
问题2:long c = AB( 5 );这条语句应该加在哪里?我理解的输出结果为:
5*4 4*3 3*2 2*1 而不是5的阶乘,请问我哪里理解错了?
展开
 我来答
王爱飞waffaw
2011-03-12 · TA获得超过317个赞
知道小有建树答主
回答量:353
采纳率:0%
帮助的人:216万
展开全部
问题1很明显,翻译成如下代码相信你理解地更好:
long a = 0;
long b = 1;

do{
a++;//注意,a = 0时,执行a++这条语句后,a的值变成了1,相信你不是不明白a++这条语句
//的含义,其实,a++这条语句的返回值是a原来的值,但是a的值自增了1,例如:
// int a = 100;
// int b = 0;
// b = a++;//执行这条语句后,b = 100, 但是 a = 101;明白了吗
b = b*a;
}while(a < 10);

long c = b;

很显然,是10的阶乘

问题2,显然你没有理解什么是“递归”(函数的递归调用)
下面就以 long c = AB(5); 来做一个分析:
(1) AB(5) = 5 * AB(4);//因为4 > 1
(2) AB(4) = 4 * AB(3);//因为3 > 1
(3) AB(3) = 3 * AB(2);//因为2 > 1
(4) AB(2) = 2 * 1;//因为2 = 1
有了上述的分解过程,相信你明白了是怎么回事了吧。
若任然不明白,建议你去看看C++编程的基础书籍
追问
问题1理解了,非常感谢。问题2我可不可以这样理解:
(1) 因为5>1,则执行 AB(5) = 5 * AB(4);执行完之后x存储的值变为4;
(2) 因为4>1,则执行 AB(4) = 4 * AB(3);执行完之后x存储的值变为3;
。。。
(5) 因为1=1,则return1
x * AB( x - 1 );就是所定义函数long AB( long x )的函数实体,对吗?
还有这个return1是什么意思?return1和return0有区别吗?
追答
我只能这么说,你可以把x看成在每一次调用的时候存储的值改变了,但是,这种理解是错误的,实际上,这里涉及到计算机是如何实现“函数调用”的,其实,long AB(long x);中的x在每一次调用中不是同一个x(我的意思是说每一次调用的时候,系统会重新分配一块内存用来存放函数调中的参数),这里涉及到堆栈的问题。相信我说的越多你越是不明白。
至于 return 语句的意思,就是说函数会返回一个值,这个值就是return语句返回的,至于
return 0 和 return 1 有什么区别,这个只能说返回的数值不一样,没有其他的区别。当然,在你的函数体中用不同的return语句,出现的情况就是你在调用AB(5)的时候,输出(准确的说是返回)的结果不一样,一个是5的阶乘,一个是0。不知这样的回答,你是否明白
kkxiao
2011-03-12 · TA获得超过222个赞
知道小有建树答主
回答量:669
采纳率:0%
帮助的人:511万
展开全部
long a = 0, b = 1;
P1:
a++;
b *= a;
if( a < 10 )
goto P1;
long c = b;

帮你翻译一下你就懂了.
a赋值0,b赋值1;
标号P1:
a加1结果赋值给a; 第一次 a=1; 第二次 a=2;......
b乘a结果赋值给b; 第一次 b=1*1 第二次 b=1*2; 第三次 b=2*3; 四次 b= 6*4;.....
如果a小于10那么转到标号P1处执行.否则往下执行.
b的值赋值给c;
long AB( long x )
{
If
( x > 1 ) return x * AB( x - 1 );
Else
return 1;
}
关键是 ( x > 1 ) return x * AB( x - 1 );
这一句,
翻译一下就是 ,如果AB(5)的话就是
(X>1)RETURN 5*(4*(3*(2*1)))
需要把此句的 AB(X-1)扩展开套进去.直到X>1不满足后执行否则返回1.
这里我用的字母是大写,因为我输入法切换小写解释起来不方便.只要你看懂就行了.
更多追问追答
追问
a++;自加1不是延迟生效吗,就是等第一次循环完之后再自加1,所以标号P1:第一次a应该是0,执行完一次之后a才会变1对吗?
如果AB(5)的话就是(X>1)RETURN 5*(4*(3*(2*1))),这个我理解不了啊,求详解,谢谢啊
追答
a++ 你的理解有些问题.书上写的延迟生效只是在某些地方需要注意由此产生的错误.像
for(a=0,a1)RETURN 5*(4*(3*(2*1))):
第一次运行到此处:
(5>1)返回5*AB(5-1) 参数为4
第二次运行到此处:
(4>1)返回4*AB(4-1) 参数为3
第三次
(3>1)返回3*AB(3-1); 参数为2
第四次
(2>1)返回 2*AB(2-1);参数为1
第五次
(1>1)条件不成立
返回1
返回结果到第四次那里... AB(2-1)结果为1;那么第四次执行的完整代码就为
(2>1)返回2*1;返回到第三次那里,完整代码为
(3>1)返回3*2*1同上到第二次
(4>1)返回4*3*2*1同上
(5>1)返回5*4*3*2*1;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
吃力
2011-03-12 · TA获得超过247个赞
知道答主
回答量:29
采纳率:0%
帮助的人:27.5万
展开全部
能不能把你的程序写完整一下啊?
更多追问追答
追问
我从教程上面考下来的例子,教程上面就是这么写的,不会写啊
追答
那从你的结果来看,按我的理解是"a++;"是单独的一条语句只有自加这一个操作,所以第一次循环式a=1。比如像printf("%d",a++)这条语句包含打印和自加两个操作,所以是先打印再自加,像上面的那个只有一个操作就没有先后之分了。然后if(a<10),则执行P1否则赋值给C。这样就得到答案了。
第二个问题:AB(long X)是一个函数,只要把C=AB(5)放在main()函数中先把X赋值为5,再调用函数AB(long X)就可以了。至于结果,这个函数属于递归问题,就是先5*4然后4再调用函数变成4*3然后3再调用函数变成3*2直到最后为1.所以最后的结果是5*4*3*2*1
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式