2012-02-13 138 views
0

使用while循環在C中使用遞歸的階乘程序。大家好,謝謝你的寶貴回覆。在while循環中使用遞歸函數的階乘程序

  1. 你們都說過使用(如果條件而不是while)。其正確的我接受你的建議。那麼爲什麼我不使用遞歸函數來尋找階乘。

  2. 有人說while(n>1)是一個無限循環。但是在這個程序中n的值在fact(n-1)函數本身中遞減。現在在這個程序中,我在while循環之後輸入printf()getch()以知道n的值。僅當while條件變爲false時,printf()getch()函數纔會執行。

當我運行此程序的printf()功能和getch()功能重複執行和printf()函數的返回值n = 1。所以我確定的n值遞減。那麼爲什麼這個程序一次又一次地執行while循環呢?

  1. 在所有函數中,return語句是最後一個函數的終止語句。當執行到達返回語句時,執行從函數中終止並返回到被調用函數的下一行。但是在這個程序中,在執行到達返回語句之後,它將重複執行相同的函數。這是爲什麼?

注:我使用的Turbo C 3.0運行此程序,

#include<stdio.h>  
int fact(int n) 
{  
    int x=1;  

    while(n>1)  
    {  
     x=n*fact(n-1);  
    } 
    printf("N value after the while loop:%d",n); 
    getch(); 
    return(x);  
}  

void main()  
{  
    int n,fact1;  
    scanf("%d",&n);  
    fact1=fact(n);  
    printf("%d",fact1);  
} 

回答

1

首先我會建議你把一個提示,這樣scanf函數之前的?當沒有文字要求你這樣做時,控制檯提示你輸入一個數字是很奇怪的。看起來程序已掛起。

printf("Give the value of n:"); 

所以爲了解決你的程序,我建議你做一些類似下面的例子。 你必須瞭解遞歸如何工作。你不能只是在while()內計算一個數字。你必須要返回一些東西,否則這是一個無限循環。

#include<stdio.h> 
int fact(int n) 
{ 
    int x=1; 

    while(n>1) 
    { 
     x = n*fact(n-1); 
     return x; 
    } 
    return x; 
} 

void main() 
{ 
    int n,fact1; 
    printf("Please provide the value of \'n\':"); 
    scanf("%d",&n); 
    fact1=fact(n); 
    printf("Result is %d",fact1); 

    return 0; 
} 
2

你確實有一個無限循環。行fact(n-1)不會減少n的值。它用較小的n調用另一個函數調用。

因此,如果您撥打fact(2),您可以撥打電話n==2。在這個函數中,你有一個無限循環,調用fact(1)。在第二次調用n==1中,所以循環條件爲false,並且此調用打印您的行並返回 - 進入第一個調用的無限循環(其n仍爲2)。