我有这个功课要做,我真的不明白为什么我的程序不能正常工作(不断打印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;
}
}
答案 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
和dig
的包装函数,并使用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;
}