2010-06-30 2 views
1

제 funciton은 사용자로부터 숫자 입력을 받아서 'n'을 1로 재귀 적으로 합칩니다.
5를 입력하면 1/5 + 1/4 + 1/3 + 1/2 + 1/1이 합계됩니다.재귀 함수가 예기치 않은 결과를 반환합니다.

#include<stdio.h> 
#include<conio.h> 
//to 
float recursion(float num,float sum); 
void main(void) 
{ 
    float num=5,sum=0; 
    //input num 
    printf("%d",recursion(num,sum)); 

    getch(); 
} 

float recursion(float num,float sum) 
{ 
    // int sum=0; every time u run it the sum is assigned 0 
    if(num==1) 
    return 1; 
    else 
    { 
    sum=sum+(1/num); 
    num--; 
    recursion(num,sum); 
    } 
    return sum; 
}//recursion function ends 

문제는 0이라는 의미입니다./아무도 도와 줄 수 있습니까?

+1

질문 본문에 질문을 올려 귀하의 질문이 닫히지 않도록하십시오. – AraK

+1

아마도 숙제입니까? – spender

+1

디버거에서 무슨 일이 일어나는지 확인하려고 했습니까? 사소한 실수가있다. 그런 질문을하기 전에 직접 해결해야합니다. –

답변

1

float를 인쇄하는 동안 왜 printf("%d")입니까? 0보다 작은 float 값을 항상 0으로 만드는 정수는 표시되지 않습니까?

float recursion(float num) 
{ 
    if(num==1.0f) 
    { 
     printf("1/1 = "); 
     return 1.0f; 
    } 
    float inverse = 1.0f/num; 
    printf("1/%.0f + ", num); 
    return (inverse + recursion(--num)); 
}//recursion function ends 

다음은 테스트 코드입니다 :

float num=5,sum=0; 
float expected = 0; 
for (int i = 1; i <= num; ++i) 
{ 
    expected += 1.0f/i; 
} 
//input num 
printf("Expected %f and got %f",expected, recursion(num)); 

출력 :이 도움이
1/5 + 1/4 + 1/3 + 1/2 + 1/1 = Expected 2.283334 and got 2.283334

희망.

+0

내 코드를 도와 줄 수 있습니까? –

-1

sum=sum+(1.0/num);을 사용하십시오. float로 정수 1을 나눌 때 float은 정수로 먼저 변환됩니다.

+2

num은 부동 소수점이며, 1/num은 이미 double로 변환됩니다. –

+0

부동 소수점 피연산자와 정수 피연산자를 제공 할 때 나누기 연산자가 자동으로 부동 소수점 결과를 반환한다고 생각합니다. – stinky472

+0

... 알렉산더가 말한 것은 잘못되었습니다. – stinky472

5

당신은 재귀 호출의 결과를 반환해야합니다 :

return recursion(num,sum); 

대신 return sum.

+4

그리고 '% d'을 (를) '% f'(으)로 변경해야합니다. – tur1ng

+0

+1. 나는 이것이 OP가 갖는 더 큰 문제 중 적어도 하나라고 생각한다. 부서에 문제가 없습니다. – stinky472

+0

@ tur1ng : 좋은 점. 0 대신 0을 설명합니다.2 – tanascius

0
float recursion(float num) { 
    if(num==1) 
    return 1; 
    return (1.0/num) + recursion(num - 1); 
} 

그런데 음수는 입력하지 마십시오!

-1
float recursion(int num) { 
    if (num == 0) { 
    return 0; 
    } 

    return 1/num + recursion(num--); 
} 
+0

정수 나누기 때문에 항상 0을 반환합니다. – IVlad

+3

이것은 실제로는 정의되지 않은 동작입니다 (그 사이에 시퀀스 포인트없이'num'과'num- '사용). 그리고 그렇지 않은 경우에도 num이 각 재귀 호출에서 동일하기 때문에 원하는 작업을 수행하지 못합니다. – sepp2k

0

@fahad :

float recursion2(float num,float sum) 
{ 
    // int sum=0; every time u run it the sum is assigned 0 
    if(num==1) 
     // Vite Falcon: Needs to return sum + 1 
     return sum + 1.0f; 
    else 
    { 
     // Vite Falcon: This is not really necessary. 
     //sum=sum+(1/num); 
     float inverse = 1.0f/num; 
     num--; 
     // Vite Falcon: The new sum is returned by the recursive function and so 
     // should be stored and returned. 
     sum = recursion2(num,sum + inverse); 
    } 
    return sum; 
}//recursion function ends 

PS : 코드의 변화는 아래 코드에 주석하고있다 내가 주석으로 여러 줄의 코드를 추가하는 방법을 모르기 때문에 나는 다시 대답했다 죄송합니다 .

관련 문제