- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您好,在练习递归时,我找到了一个不使用 % 运算符即可找到模数的练习。所以我写了我的函数,一切正常。除非我用 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');
}
错误是:
Unhandled exception at 0x00007FF77D5C2793 in GuessNumber.exe: 0xC00000FD: Stack overflow (parameters: 0x0000000000000001, 0x0000006F322F3F30).
对于我试过的数字 40001 % 10,它有效但 44001 % 10 失败了44001 之后的一切对我来说也都失败了。我没有试过任何其他号码
最佳答案
如果递归太深,程序就会用完堆栈内存。它被称为堆栈溢出。
int modulo(int n, int m)
{
if (n < m) return n;
else return modulo(n - m, m);
}
例如,modulo(1000000, 2)
调用modulo(999998, 2)
,后者调用modulo(999996, 2)
,依此类推,直到 modulo(0, 2)
最后,堆栈上有 500001 个事件的 modulo
函数。两个整数、返回地址和一个帧指针,在任何合理的系统上每个函数调用应该至少占用 16 个字节。总共 8 兆字节的堆栈空间,通常超过最大堆栈大小。
每个函数调用都必须等待下一个函数的结果,直到它可以完成计算并返回。在它返回之前,堆栈必须保存所有变量、参数和返回地址。返回地址是程序中在 return
语句之后应该继续执行的位置。
这些调用会填满堆栈,直到达到最大限制并导致程序崩溃。
在某些情况下,编译器可以将递归转换为循环。在这种情况下,由于递归是在 return
语句处进行的,因此它可以简单地 goto
到函数的开头,而根本不执行调用。这称为尾调用优化:
int modulo(int n, int m)
{
start:
if (n < m) return n;
else {
n -= m;
goto start;
}
}
如果您启用优化(clang 或 G++ 中的 -O2,或 Visual C++ 中的 Release模式),则不会发生崩溃,因为编译器会创建一个循环而不是递归。为避免崩溃,只需启用优化即可。
请注意,编译器不需要对此进行优化,也不总是可以。这就是为什么不建议进行如此深的递归。
关于c++递归大数以查找mod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55084007/
如何在 Mod Security 中获取响应/请求正文的大小? 我不断收到此错误,例如: [Mon Sep 17 23:34:38 2012] [error] [client 192.168.1.1]
我要计算的值 对于给定的 N 值,F(N) = (F(N-1) * [((N-R+1)^(N-R+1))/(R^R)]) mod M, R 和 M. 这里 A^B 显示 A 的幂 B 而不是任何位操作
这个程序中的ans = (ans + mod) % mod语句需要什么? 假设 mod = 10^9+7。此函数在 O(log(n)) 复杂度的模运算下计算 a 的 b 次方: long long p
我正在尝试做简单的思考。在循环中使用 ng-include 将多个 html 页面包含到渲染页面。 $scope.modules = ["mod_nav","mod_feature"
我有一个使用moodle库的项目。由于客户端请求,我不得不将 URL 从moodle.example.com 更改为learn.example.com。 我认为这将是一个简单的更改,但唉,moodle
我正在尝试制作一个 Taskfile.yml 文件来构建 go 应用程序,但我不太明白在 go build main.go 之前需要“GOFLAGS=-mod=mod”命令。 引用:https://d
我正在尝试制作一个 Taskfile.yml 文件来构建 go 应用程序,但我不太明白在 go build main.go 之前需要“GOFLAGS=-mod=mod”命令。 引用:https://d
首先,我想说,我从谷歌尝试了很多方法,但 mod_rewrite 不起作用! 我从 httpd.conf 尝试了我在谷歌上找到的 1000000 种方式,但仍然无法正常工作。 我想从 example.
你好我试图安装 libapache2-mod-fcgid mod 但总是出错。 root@mail:~# sudo apt-get install libapache2-mod-fcgid Readi
我需要在 URL 中使用 + 字符。我将 Apache 与 PHP 结合使用。 ([A-Za-z0-9/_%-@\+]*) 不起作用。 我需要的是www.domain.com/c++/ => inde
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 2年前关闭。 Improve this questi
我正在尝试在新的 Ubuntu 14.04 上设置一个 apache2 Web 服务器。我一直按照找到的说明进行操作 here一切都很顺利,直到我到达被告知编辑 mod-security.conf 的
当我运行“go mod tidy”时它会中断,因为我的项目导入的包使用路径“github.com/coreos/bbolt”导入了另一个包,但是当它从该路径获取包时,它的 go.mod 说它的路径是“
这种脚本语言没有 % 或 Mod()。我确实有一个 Fix() 可以去掉数字的小数部分。我只需要积极的结果,所以不要太健壮。 最佳答案 威尔 // mod = a % b c = Fix(a / b)
在我的小项目中,我有一个脚本通过运行静态代码检查来确保正确的代码质量,例如,我使用 errcheck验证我是否处理了代码中的每个错误。 在 dep ,对于这种依赖有一个特殊的部分,称为 require
我使用 sudo apt install golang-go 在我的 ubuntu 中安装了 go 语言. 它已成功安装。当我运行 go version我收到 go version go1.10.4
谁能帮我解决这个问题: RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC] RewriteRule ^(.*)$ http://www.$1 [R=301,L] 我想
BigIntegerValue.pow(IntegerValue) Java 上的指数是整数,但我有 Biginteger 值。 我曾尝试验证签名 GOST 3410,我得到了这个代码 pow,但它太
所以我才开始使用 Forge。我只是有一个非常简单的示例 mod 用于学习目的。当我使用 gradlew build 导出 mod 时,一切正常,它将 mod 放入 forge 的 build\lib
在玩 jmh 时,我遇到了一件我无法解释的奇怪事情。 @BenchmarkMode(Mode.SingleShotTime) @Measurement(iterations = 10, batchSi
我是一名优秀的程序员,十分优秀!