使用递归编程布尔程序

时间:2017-12-23 15:16:06

标签: c++ recursion

我有这个功课要做,我真的不明白为什么我的程序不能正常工作(不断打印1)。

我应该创建一个程序,从用户接收一个数字和一个数字(我们可以假设输入正常) 如果数字出现在数字内,则打印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 个答案:

答案 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;
}