2016-12-07 43 views
2

私は基本的にC言語の経験がないので、なぜこれがうまくいかないのか分かりません。それは、これは任意の助けをいただければ幸いですので、何が起こっている理由は、私はよく分からない1を出力しますが120になるまでc関数が呼び出されていませんか?

#include <stdio.h> 

int a=1; 
int b=5; 

void fact(a,b) { 

    if(b == 1) { 
     return; 
    } else { 
     a = a * b; 
     b = b - 1; 
     fact(a, b); 
    } 
} 

int main() { 

    fact(a, b); 
    printf("%d", a); 
} 

プログラムは、再帰的に事実を呼び出す必要があります。

+2

ようにそれを呼び出すために簡単だろうしかし

fact(&a, &b); 

のような関数を呼び出しますこの関数は 'a'と' b'の* copies *を渡します。 dは何も返さない。関数内の 'a'と' b'はローカルスコープ(と命)のみを持つ同じ名前のグローバル変数とは異なる変数です。 –

+0

関数内のパラメータ変数 'a'と' b'は、同じ名前のグローバル変数をシャドウします。 – Barmar

+0

このコードはコンパイルされますか? – Jay

答えて

3

変数aとbのコピーを渡しています。値を更新する場合は、変数をポインタとして渡します。

void fact(int *a, int *b) { 

    if(*b == 1) { 
     return; 
    } else { 

     *a = *a * *b; 
     *b = *b - 1; 
     fact(a, b); 
     } 
    } 

    int main() { 

     fact(&a, &b); 
     printf("%d", a); 
    } 

あなたは下のリンクを訪問することができます - - (コンパイラがそれを受け入れている場合)この関数の定義

void fact(a,b) { 

if(b == 1) { 
    return; 
} else { 

    a = a * b; 
    b = b - 1; 
    fact(a, b); 
    } 
} 

が実際に見えます

How to update the value in another function

+0

aとbはグローバル変数であるため、 'void fact(a、b){'〜 'void fact(c、d){'は出力120を出力します! :Pしかしあなたの答えは正しいです。 – MayurK

+0

'b'を値で渡すことができます。変異しているのは「a」だけです。 –

+0

@sas:あなたはまだ値渡しをしています。しかし、あなたはメモリアドレスを渡しています。 – MayurK

0

を は、以下のコードを修正します次のようにします。

関数定義の変数 abがグローバルが使用されている関数呼び出しでこのように、このコール

fact(a, b); 

によって関数に指定された引数のコピーを持っている関数のローカル変数とされる

変数abですが、関数自体の内部には、グローバル変数のコピーであるローカル変数abが使用されています。これらのローカル変数の変更は、グローバル変数に影響を与えません。

この問題を解決するにはどうすればよいですか?

最初の方法は、関数パラメータを削除することです。この場合、関数定義の内側abは、グローバル変数

void fact(void) 
{ 

if(b == 1) { 
    return; 
} else { 

    a = a * b; 
    b = b - 1; 
    fact(a, b); 
    } 
} 

を意味し、あなたが期待される結果を取得します。

第2のアプローチは、パラメータを使用するだけでなく、結果を返すことです。例えば、

intファクト(a、b) int a、b; { if(b == 1){ return a; }他{

a = a * b; 
b = b - 1; 
return fact(a, b); 
} 

}

そのような関数定義が廃止されただし、以下のよう

a = fact(a, b); 

関数を呼び出します。

int fact(int a, int b) 
{ 
if(b == 1) { 
    return a; 
} else { 

    a = a * b; 
    b = b - 1; 
    return fact(a, b); 
    } 
} 

ようにそれを書くために良いだろうそして第三のアプローチは、参照によって関数に引数を渡すことです。例

void fact(int *pa, int *pb) 
{ 

if(*pb == 1) { 
    return; 
} else { 

    *pa = *pa * b; 
    *pb = *pb - 1; 
    fact(pa, pb); 
    } 
} 

については、機能に次のよう

int fact(int n) 
{ 
    return n < 1 ? 1 : n * fact(n - 1); 
} 

を書いて、

a = fact(b); 
関連する問題