2016-12-07 2 views
2

기본적으로 C 언어에 대한 경험이 없으므로 이것이 작동하지 않는 이유가 확실하지 않습니다. 그것은이 그래서 어떤 도움을 주시면 감사하겠습니다 일어나고있는 이유를 잘 모르겠어요 1. 인쇄 그러나,이 120이 될 때까지함수가 호출되지 않습니까?

#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); 
    } 

당신은 아래 링크를 방문 할 수 있습니다 -

How to update the value in another function

+0

a와 b는 전역 변수이기 때문에, 단지 을 void 변경 (사실, (b)) { 'void 사실 (c, d) {는 출력 120을 준다! : P하지만 당신의 대답은 정확합니다. – MayurK

+0

값으로 'b'를 전달할 수 있습니다. 돌연변이를 일으키는 것은 'a'뿐입니다. –

+0

@sas : 당신은 여전히 ​​가치에 의해 패스하고 있습니다. 하지만 메모리 주소를 전달하고 있습니다. – MayurK

0

이 함수 정의가

void fact(a,b) { 

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

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

실제로 보이는 (컴파일러가 그것을 받아들이는 제공) 다음과 같은 방법으로

,396,442,

함수 정의에서 변수 ab 즉,이 호출 따라서, 함수 호출

fact(a, b); 

하여 함수에 제공된 인수 사본이 함수의 로컬 변수는이 글로벌 사용 변수 ab이지만 함수 자체 내에는 전역 변수의 복사본 인 로컬 변수 ab이 사용됩니다. 이러한 지역 변수의 변경 사항은 전역 변수에 영향을 미치지 않습니다.

문제를 해결하는 방법?

첫 번째 방법은 함수 매개 변수를 제거하는 것입니다. 함수 정의 내이 경우 ab에서 전역 변수

void fact(void) 
{ 

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

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

을 표시하고 당신은 예상 된 결과를 얻을 것이다.

두 번째 방법은 매개 변수를 사용하는 것뿐 아니라 결과를 반환하는 것입니다. 예 :

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); 
관련 문제