黑马程序员技术交流社区

标题: 递归 [打印本页]

作者: 一只小菜鸟    时间: 2014-4-10 21:14
标题: 递归
本帖最后由 一只小菜鸟 于 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--);
复制代码

作者: haohaoxuexi    时间: 2014-4-10 22:07
  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,然后再运算
复制代码

作者: haohaoxuexi    时间: 2014-4-10 22:17
若是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. }
复制代码

作者: 一只小菜鸟    时间: 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