2014-11-02 4 views
1

나는 C++을 사용하여 재귀를 사용하여 사용자 입력 이진수를 소수로 변환하는 프로그램을 작성하고 있습니다. 나는 내 재귀 함수이다 (이전에 내가 i = binary.length();i 초기화) 시간재귀 이진에서 십진수로

이 코드

void bin2dec(string binary, int i) 
{ 
    double decNum=0; 

    if (i >= 0) 
    { 
     if (binary[i] = 0) 
     { 
      decNum = (decNum + 0); 
     } 
     else 
     { 
      decNum = (decNum + pow(2, (i-1))); 
     } 
     bin2dec(binary, i-1); 
    } 
    cout << decNum; 
} 

와 함께 연주했습니다. 불행히도, 나는 붙어있다. 프로그램이 실행되지만 잘못된 값을 제공합니다. 예를 들어, 내가 바이너리로 1을 꽂으면, 그 결과로 10 진수를 얻을 것으로 예상됩니다. 하지만 나는 .5 숫자를 얻는다. 내 계산이 잘못되었거나 잘못 재귀를 사용하고 있습니까?

제안을 받으면 다음과 같이 변경했습니다. 그러나 프로그램이 여전히 잘못된 값을 반환합니다.

void bin2dec(string binary, int i) 
{ 
    double decNum=0; 
    if (i >= 0) 
    { 
     if (binary[i] == 1) 
     { 
      decNum = (decNum + pow(2, i)); 
     } 
     else if (binary[i] == 0) 
     { 
      decNum = (decNum + 0); 
     } 
     bin2dec(binary, i - 1); 
     cout << decNum; 
    } 
} 
+0

나는 BIN2DEC 전환에 재귀를 사용하는 것이 결코 생각하지 않았다! "decNum"은 지역 변수이고 모든 호출에서 항상 0으로 초기화된다는 것을 알고 있습니까? – Jdamian

+1

@ Jdamian 발신자에게 번호를 반환 할 방법이 없기 때문에 그녀는 출력하기 위해 작성하는 것 같습니다. – IllusiveBrian

+0

귀하의 예에서 2^(- 1) 값, 즉 0.5가 반환되는 이유를 알고 있습니까? – Jdamian

답변

3

작은 엔디안을 사용한다고 가정하면 pow(2, i)을 사용해야합니다. i-1으로 배열의 위치 0에 1이 있어야하는데, 이는 pow(2, -1)을 0.5로 평가 함을 의미합니다.

이 작동 예 (https://ideone.com/pWVAGP) 고려 : 문자열의 끝에서 시작하여 역방향으로 작동 할 수 있다는

int bintodec(string binary, unsigned int i = 0) 
{ 
    int tot = 0; 
    if (i < binary.length()) 
    { 
     if (binary[i] == '1') 
      tot = pow(2, i); 
     else if (binary[i] != '0') 
      throw "String is not formatted in binary"; 
     return tot + bintodec(binary, ++i); 
    } 
    return tot; 
} 

참고,하지만 난 그것을 간단하게 생각하기 때문에 나는 0에서 시작 선호합니다. 추가 작업을 합산하기 위해 가장 쉬운 방법은 if(i < binary.length() 블록의 끝에서했던 것처럼 함수의 다른 호출을 반환하는 것입니다. 기본 케이스 (이 경우 i == binary.length())에 도달하면 총 숫자에 추가되지만 값은 변경되지 않는 0을 반환합니다. 기본 사례가 반환되면 다른 호출자는 합계의 일부를 반환하여 원래 호출 함수 인 호출 스택의 맨 아래에 도달 할 때까지 계속 추가됩니다. 당신이 대답을 반환하지 않을 경우

, 당신은 void bintodec(int& tot, string binary, unsigned int i = 0)에 함수 서명을 변경하고 tot에 값을 추가보다는 반환 유지하지만 발신자가 당신에게 수정할 수 int 제공해야합니다 수 있습니다.

+0

그러나 바이너리가 1000 (i = 4) 일 때 어떻게됩니까? 소수는^2가 아닌 2^3이어야합니다. –

+0

@SashaMiko이 경우,'i'는 3이됩니다. 배열은 인덱스가 0 인 것을 기억하십시오. 부수적으로, 1000은 프로그램에 대해 1과 같습니다. 이것이 의도입니까? – IllusiveBrian

+0

@SashaMiko 왜 정수 값이 필요할 때 double 값을 사용합니까? – Jdamian

0

위의 알고리즘을 약간 개선 한 버전입니다. 이는 pow() 기능을 사용하지 않는 것입니다 :

int btod_r(int n, int p = 0) { 
    if(n == 0) return 0; 
    if(p == 0) return n%10 + btod_r(n/10, 2); 
    return (n%10) * p + btod_r(n/10, 2*p); 
} 

참고 : 여기에 바이너리 입력 대신 string 동의를 다시 쓸 수있는 작은 수정와 더불어, int입니다.

0

솔루션은 :

int bin2dec(long long num) 
{ 
    if(num==0) return 0; 
    return num%10+2*bin2dec(num/10); 
} 
+0

이 코드는 질문에 대답 할 수 있지만, 질문에 대답하면 장기적인 가치가 향상됩니다. – rollstuhlfahrer