2017-12-23 18 views
0

私はこの宿題をしています。私のプログラムが本当にうまくいかない理由を理解していません。再帰を使用してブール値プログラムをプログラミングする

私は、数字と桁をユーザーから受け取ります(入力は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

ところで、数字で演奏するときは、数字を文字列にしておくことをお勧めします。各桁は、「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)でそれを呼び出すか、単にnumとを取り、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; 
} 
関連する問題