【发布时间】:2019-03-10 02:50:17
【问题描述】:
您好,在练习递归时,我发现了一个不使用 % 运算符即可找到模数的练习。 所以我写了我的函数,一切正常。 除非我击中 5 位或更多位的数字,否则此功能会失败。 而且我不确定我是做错了什么还是因为电话太多而失败了。 如果电话太多,正常吗?真的可以有太多的函数调用吗?如果将来我有一个真正有用的递归函数,我该如何防止它发生? 因为这对我来说真的没有意义。我做了河内递归塔,无论我要移动多少个磁盘,它都没有这个问题。
这是我的功能,前提是两个数字始终为正:
#include <iostream>
using namespace std;
int modulo(int n, int m) {
if (n < m) return n;
else return modulo(n - m, m);
}
int main()
{
int n{ 0 }, m{ 0 };
char check{ 'a' };
do {
cout << "Enter 2 positive integers to calculate their modulo: ";
cin >> n >> m;
if (cin.fail()) {
cerr << "Numbers must be a positive integers. Please try again.\n";
cin.clear(); //clear input stream
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //discard any unprocessed characters
}
else if (n < 0 || m <= 0) {
cerr << "Numbers must be positive and second number cannot be zero.\nPlease try again.\n";
}
else {
cout << "n%m = " << n << "%" << m << " = " << modulo(n, m) << endl;
cout << " Try again? (enter 'n' to quit): ";
cin >> check;
}
} while (check != 'n');
}
错误是:
GuessNumber.exe 中 0x00007FF77D5C2793 处的未处理异常: 0xC00000FD:堆栈溢出(参数:0x0000000000000001, 0x0000006F322F3F30)。
对于我尝试的数字 40001 % 10,它可以工作,但 44001 % 10 失败 44001 之后的一切对我来说也都失败了。其他号码我没试过
【问题讨论】:
-
能否请您添加错误打印输出(如果有)?
-
感觉就像由于递归调用堆栈而导致堆栈溢出。但是一个错误会有助于理解。
-
导致错误的最小数字是多少?
-
错误确实是堆栈溢出。我只是不明白我为什么要买一个。 GuessNumber.exe 中 0x00007FF77D5C2793 处的未处理异常:0xC00000FD:堆栈溢出(参数:0x0000000000000001、0x0000006F322F3F30)。对于我尝试的数字 40001 % 10,它可以工作,但 44001 % 10 失败
-
您是否尝试过使用 40000 个磁盘的 Tower of Hanoi 程序?