2017-12-23 1 views
0

나는이 숙제를 가지고 있고 왜 내 프로그램이 실제로 작동하지 않는지 이해하지 못합니다 (끊임없이 1 번 인쇄).재귀를 사용하여 불리언 프로그램 프로그래밍

사용자로부터 숫자와 숫자를받는 프로그램을 작성한다고 가정합니다 (입력은 ok라고 가정 할 수 있습니다) 숫자가 짝수 시간 안에 나타날 경우 1을 인쇄합니다. 그것은 이상한 양의 경우 0을 인쇄합니다. 부울 재귀 함수를 사용해야합니다.

사람이 나에게 뭐가 잘못 됐는지 말해 줄 수 있습니까?

#include <iostream> 
using namespace std; 
bool isEven(int num, int dig); 
void main() 
{ 
    bool res; 
    int num, dig; 
    cout << "Please enter a number and a digit" << endl; 
    cin >> num >> dig; 
    cout << isEven(num, dig); 
} 
bool isEven(int num, int dig) 
{ 
    bool res; 
    int counter = 0; 
    if (num < 10) 
    { 
     if (counter % 2 != 0) 
      res=false; 
     else 
      res=true; 
     return res; 
    } 
    else 
    { 
     res=isEven(num/10, dig); 
     if (num % 10 == dig) 
      counter++; 
     return res; 
    } 
} 
+1

[디버거를 사용하는 방법을 배우게] (HTTPS : //ericlippert.com/2014/03/05/how-to-debug-small-programs/). 몇 분 안에이 프로그램의 문제점을 보여 주며 앞으로 몇 시간을 절약 할 것입니다. – hnefatl

+2

'void main'은 무효입니다. C++. 대신에'int main'을 사용하십시오. – hnefatl

+0

BTW, 숫자로 재생할 때 숫자를 문자열로 유지하는 것을 선호합니다. 각 숫자는''0 ''을 빼서 문자에서 숫자로 변환 할 수 있습니다 :'int digit = number_as_text [i] - '0';' –

답변

0

당신은 당신의 재귀 호출을 통해 아래로 counter의 값을 전달하지 않는 - 그것은 당신의 현재 구현에 효과적으로 사용되지 않는입니다.

코드에 dig % 10 == num 인 경우 하나의 체크가 누락되었습니다. 코드에서 마지막 숫자를 확인하지 않습니다.

bool isEven(int num, int dig, int counter) 
{ 
    bool res; 

    if (num % 10 == dig) 
     counter++; 

    if (num < 10) 
    { 
     if (counter % 2 != 0) 
      res=false; 
     else 
      res=true; 
     return res; 
    } 
    else 
    { 
     res=isEven(num/10, dig, counter); 
     return res; 
    } 
} 

그리고 당신은 isEven(num, dig, 0)로 전화하거나 numdig 소요 0이 버전을 호출하는 래퍼 함수를 ​​만들 수 있습니다. 그것은 몇 가지 다소 직관적 비트를 가지고 있지만


참고, 카운터를 사용하지 않고이 기능의 (IMO) 더 우아한 재귀 표현이 있다고 :

bool isEven(int num, int dig) 
{ 
    // Base case, single digit 
    // If num % 10 == dig on this last digit, we've got 1 match (odd, so return false) 
    if (num < 10) 
     return num % 10 != dig; 

    bool result = isEven(num/10, dig); 
    if (num % 10 == dig) // This digit matches, count one more/flip the result 
     result = !result; 

    return result; 
} 
관련 문제