【问题标题】:What is the difference between the two locations?这两个位置有什么区别?
【发布时间】:2012-09-23 12:12:05
【问题描述】:

我有一个递归程序。 printf 在函数中使用时输出 123 ,在外部使用时输出 0123 。

#include <stdio.h>

fact(int);
int main()
{
    int x=3;
    fact(x);
    printf("\n");
    system("PAUSE");
}

int fact(int y)
{
    if (y > 0)
    {
         fact(y-1);
         printf("%d",y);  
    }
    //printf("%d",y);   
}   

我没有同时使用printf。这个printf 语句的位置有什么不同?

【问题讨论】:

    标签: c function recursion


    【解决方案1】:

    由于您的 if 条件查找大于零的值,因此它按预期工作。

    【讨论】:

      【解决方案2】:

      当使用IF 块外的printf 时,即使y 为0 也会执行,而IF 块内的printf 则不是这种情况。

      【讨论】:

        【解决方案3】:

        fact(int) 按以下顺序调用,

        事实(3)-->事实(2)--->事实(1)--->事实(0)

        最后一次调用是 fact(0)。根据 fact(int) 的实现,传入 0 时,如果在外部使用 printf(),则打印 0。如果内部使用了 printf(),则不打印 0。

        事实上,所有传入 fact(int) 的值都是在外部使用 printf() 时打印出来的。

        【讨论】:

          【解决方案4】:

          我想说您自己没有看到答案的一个原因是您的代码草率。以下是一些抱怨:

          1. 您的函数没有明确的返回语句 对于理解递归代码尤其重要。
          2. system() 需要 stdlib,但不包括 stdlib.h。
          3. system("PAUSE") 是不可移植且不必要的。实际上你的代码 因此无法在我的系统上运行。看: http://www.gidnetwork.com/b-61.html
          4. 您的问题看起来像作业,所以这个是作业的错,而不是您的:因为 n!增长如此之快,使用'int'作为返回类型的阶乘函数只能计算n!对于 1

          试试这个练习:使用单个 return 和条件赋值编写一个单行阶乘函数。

          【讨论】:

          • 我应该补充一点,我并不想因为你在学习编码时不完美而嘲笑你。我的意思是:更简洁的代码 => 更容易阅读 => 更少的错误
          猜你喜欢
          • 2014-07-04
          • 2011-12-19
          • 1970-01-01
          • 2012-06-12
          • 2016-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多