黑马程序员技术交流社区
标题:
递归
[打印本页]
作者:
一只小菜鸟
时间:
2014-4-10 21:14
标题:
递归
本帖最后由 一只小菜鸟 于 2014-4-10 22:29 编辑
int tes8(int n){
if (n==0) return 1;
return n*tes8(n-1);
}
为什么不能tes8(n--);
复制代码
作者:
haohaoxuexi
时间:
2014-4-10 22:07
int tes8(int n){
if (n==0) return 1;
return n*tes8(n-1);
}
为什么不能tes8(n--);//这个涉及到n的运算,n--,是先运算,然后n的值减1,--n是,先对n减1,然后再运算
复制代码
作者:
haohaoxuexi
时间:
2014-4-10 22:17
若是n--的话,n的值应该是一直不会改变,因为只有运算完,n的值才会减1,但是一直运算不完,所以不会减一,有代码你可以测试一下
#include<stdio.h>
int tes8(int n)
{
if (n==0) return 1;
printf("meiyunsuanwang\n");
return n*tes8(n--);
}
int main()
{
int n=3;
int sum=tes8(n);
printf("%d\n",sum);
return 0;
}
复制代码
作者:
一只小菜鸟
时间:
2014-4-10 22:29
haohaoxuexi 发表于 2014-4-10 22:17
若是n--的话,n的值应该是一直不会改变,因为只有运算完,n的值才会减1,但是一直运算不完,所以不会减一, ...
果然,失误失误,n*tes8(--n);也有警告,但是可以用。当时试都没试,就以为在不能调用了.....thank you
作者:
啊康
时间:
2014-4-10 22:36
int tes8(int n){
if (n==0) return 1;
return n*tes8(n-1);
}
为什么不能tes8(n--);
这个涉及到n--的问题
这个递归结束的条件是n = 0;
如果n的初始值是奇数的时候
int tes8(int n--){
if (n==0) return 1;
return n*tes8((n--)-1);
}
按照上面的代码如果n的原始值是2的话经过int tes8(int n--)之后n的数值直接变为1,
不执行if条件句,继续执行int tes8(int (n--)-1)这个时候函数参数的数值直接变为0,而n的数值反而变为-1了。因此这样一直递归下去就成了死循环,所以能否用n--是要看n的原始数值是奇数还是偶数。
这样定义是有安全隐患的,所以一般使用上面的方法。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2