2012-09-23 87 views
0

我有一个递归程序。在功能中使用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声明的位置有什么不同?

回答

0

事实(INT)是由下列顺序调用,

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

的最后的呼叫是事实(0)。根据fact(int)的实现,当传入0时,如果在场外使用printf(),则会打印0。如果内部使用printf(),则不打印0。

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

1

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

1

当该IF块之外printf被使用,即使当y是0,这是不针对IF块内的printf的情况下,它被执行。

0

我想说你自己没有看到答案的原因之一是你的代码很琐碎。这里有一些投诉:

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

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

+0

我应该补充一点,当你学习编码时,我并没有试图在你身上造成不完美。我的观点只是:更简洁的代码=>更容易阅读=>更少的错误 –