![](/img/trans.png)
[英]Not sure how to fix this StackOverflow Exception was Unhandled error
[英]stackoverflow exception was unhandled
在下面的代码中,它应该乘以2个数字。 它适用于3位数和少于3位数的数字,但是当我给出4位数或更大的数字时,它会给出运行时错误: stackoverflow exception was unhandled
。 我已经评论了问题所在。 我以为问题是在int
定义变量,并长时间更改了它们,但问题仍然存在。 错误在哪里?
编辑:现在,您如何看待问题?它什么都没做
public long Prod2(long u, long v)
{
var numbers = textBox7.Text.Split(',').Select(p => long.Parse(p)).ToArray();
int n = Math.Max((int)Math.Floor(Math.Log10(u) + 1),(int)Math.Floor(Math.Log10(v) + 1));
int threshold = 3;
if (u == 0 || v == 0)
{
return 0;
}
else if (n <= threshold)
{
return u * v;
}
else
{
int m = (int)Math.Ceiling(n / 2.0);
int x = (int)(u / Math.Pow(10, m));
int y = (int)(u % Math.Pow(10, m));
int w = (int)(u / Math.Pow(10, m));
int z = (int)(v % Math.Pow(10, m));
long r = Prod2(x + y, w + z);
long p = Prod2(x, w);
long q = Prod2(y, z);
return p * (long)Math.Pow(10, 2 * m) + (r - p - q) * (long)Math.Pow(10, m) + q;
long result = Prod2(numbers[0], numbers[1]);
textBox1.Text = result.ToString();
}
}
您现在正在进入无限递归循环
long result = bigzarb(x, w) * Math.Pow(10, m) + (bigzarb(x, w) + bigzarb(w, y)) * Math.Pow(10, m) + bigzarb(y, z);///here
textBox1.Text = result.ToString();
我注意到只有在intn > 3
时才执行此行,所以也许您那里有逻辑错误?
更新:阅读您的评论后,我可以看到该测试的目的是说“如果此字符串的长度<= 3,则...”,而实际上是这样写的:“如果此转换后的字符串的值是<= 3那么...”
简而言之,您可能会遇到以下情况:
function bigzarb()
{
bigzarb()
}
只要textBox7
中的数字> 3,即未封闭的递归循环,将不可避免地成为stackoverflow。
在有问题的线上放置一个断点,您将很快发现问题。 在不知道您的方法做什么的情况下(我无法识别算法),在清理它方面我无济于事,但是第一步可能是要有一个getout子句有条件地从函数中返回。 但是,我还看到您在使用输入参数u
和v
之前将它们覆盖了,所以也许您在算法中犯了一个错误?
编辑:我已经为您完全翻译了本书中描述的算法:
public long Prod2(long u, long v)
{
int n = Math.Max((int)Math.Floor(Math.Log10(u) + 1), (int)Math.Floor(Math.Log10(v) + 1));
int threshold = 3;
if(u == 0 || v == 0)
{
return 0;
}
else if(n <= threshold)
{
return u * v;
}
else
{
int m = (int)Math.Ceiling(n / 2.0);
int x = (int)(u / Math.Pow(10, m));
int y = (int)(u % Math.Pow(10, m));
int w = (int)(u / Math.Pow(10, m));
int z = (int)(v % Math.Pow(10, m));
long r = Prod2(x + y, w + z);
long p = Prod2(x, w);
long q = Prod2(y, z);
return p * (long)Math.Pow(10, 2 * m) + (r - p - q) * (long)Math.Pow(10, m) + q;
}
}
为了获得正确的结果,可以从其他类似的方法中调用此方法:
void Main()
{
// Call the method and store the result in variable 'r'.
long r = Prod2(1234, 5678);
Console.WriteLine(r);
/////////////////////////////////
//
// OR - In your case read from textBox7 and then store the result in textBox1
//
/////////////////////////////////
var numbers = textBox7.Text.Split(',').Select(p => long.Parse(p)).ToArray();
long result = prod2(numbers[0], numbers[1]);
textBox1.Text = result.ToString();
}
因此,在事件处理程序中,例如对于button1
,您可以执行以下操作来进行调用:
public void button1_Click()
{
var numbers = textBox7.Text.Split(',').Select(p => long.Parse(p)).ToArray();
long result = prod2(numbers[0], numbers[1]);
textBox1.Text = result.ToString();
}
不要修改我拥有的Prod2
,只需将其粘贴到您的代码中即可。 这样,Prod2会进行计算,然后您的button1_Click
控制输入以及如何处理输出 。
Pow方法返回double,因此我认为您的x,y,z,w和z也应声明为double。
您将获得递归调用的“ StackoverFlow”。 最好模制代码中的孔。 我建议您改变逻辑。
static int callStack = 0;
public double bigzarb(long u, long v)
{
callStack++;
............
............
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.