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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 一只小菜鸟 中级黑马   /  2014-4-10 21:14  /  1062 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 一只小菜鸟 于 2014-4-10 22:29 编辑
  1. int tes8(int n){
  2.     if (n==0) return 1;
  3.     return n*tes8(n-1);
  4. }

  5. 为什么不能tes8(n--);
复制代码

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

4 个回复

倒序浏览
  1. int tes8(int n){
  2.     if (n==0) return 1;
  3.     return n*tes8(n-1);
  4. }

  5. 为什么不能tes8(n--);//这个涉及到n的运算,n--,是先运算,然后n的值减1,--n是,先对n减1,然后再运算
复制代码
回复 使用道具 举报
若是n--的话,n的值应该是一直不会改变,因为只有运算完,n的值才会减1,但是一直运算不完,所以不会减一,有代码你可以测试一下
  1. #include<stdio.h>
  2. int tes8(int n)
  3.         {
  4.     if (n==0) return 1;
  5.         printf("meiyunsuanwang\n");
  6.     return n*tes8(n--);
  7.         }
  8. int main()
  9. {
  10.        
  11.         int n=3;
  12.         int sum=tes8(n);
  13. printf("%d\n",sum);
  14. return 0;

  15. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
haohaoxuexi 发表于 2014-4-10 22:17
若是n--的话,n的值应该是一直不会改变,因为只有运算完,n的值才会减1,但是一直运算不完,所以不会减一, ...

果然,失误失误,n*tes8(--n);也有警告,但是可以用。当时试都没试,就以为在不能调用了.....thank you
回复 使用道具 举报
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的原始数值是奇数还是偶数。
这样定义是有安全隐患的,所以一般使用上面的方法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马