C# 两个数x和y的阶乘和等于10的阶乘是什么
我必须返回两个阶乘和等于10的数!。应在数组中返回两个数字。我已经做了如下代码,但它找不到任何这两个数字。它以“堆栈溢出异常”结束。 我的代码是:C# 两个数x和y的阶乘和等于10的阶乘是什么,c#,C#,我必须返回两个阶乘和等于10的数!。应在数组中返回两个数字。我已经做了如下代码,但它找不到任何这两个数字。它以“堆栈溢出异常”结束。 我的代码是: private int[] solve10() { int[] n = new int[2]; bool found=false; int c1 = 1; int fact1 = 0; int fact2 = 0; int fact10 = 0;
private int[] solve10()
{
int[] n = new int[2];
bool found=false;
int c1 = 1;
int fact1 = 0;
int fact2 = 0;
int fact10 = 0;
try
{
fact10 = findFactorial(10);
while(!found)
{
fact1 = findFactorial(c1);
for (int j = 1; j < 10;j++)
{
fact2 = findFactorial(j);
if (fact1+fact2==fact10)
{
n[0] = c1;
n[1] = j;
found = true;
break;
}
}
c1++;
}
return n;
}
catch (Exception ex)
{
throw ex;
}
}
你的问题是你在递归地做这件事,这对堆栈空间来说是非常密集的。我的建议是重写,这样它只是迭代;尽管递归地编写它在认知上更简单,但所有这些方法调用实际上是相加的。如果是为了一个赋值或其他什么,而你必须递归地执行它,那么添加一些堆栈空间 如{0,1}对中的唯一解决方案所述 由于示例中的搜索以1开头,因此根本无法找到解决方案。所以
而循环从未停止过。请注意,在表达式c1!+我
最大值不受任何限制(不同于属于1-10范围的i
)。这导致计算越来越大的数字的阶乘,直到大约14000!发生堆栈溢出
修复-当c1
为10时,以0开始两个值并停止迭代,或者将嵌套为循环0-10,而不是while(found)
注意,由于整数计算的溢出行为,可以尝试计算大数的阶乘,如100代码>显示代码(也将返回0,如中所示),直到递归代码在非常大的(对我来说大约14000!个)数字上出现堆栈溢出。现在,从数学上讲也是n!>2x(n-1)代码>用于所有n>2
。换句话说,不存在一对来自[1..9]
的数字,因此阶乘之和等于10阶乘。没有解决办法
代码的问题在于,只有当您找到问题的解决方案时,中断才会出现
没有解决办法
因此,您的代码将继续,而将永远循环,递增c1
,直到调用findFactorial(c1)
导致堆栈溢出。这在前面讨论过,更有趣的是答案中的第3点。为什么在那里有try
/catch
块?您希望它抛出什么异常,您可以从中恢复?我没有注意到,但您在这两个方面都有一个try
/catch
。这就是您编写所有代码的方式吗?这是一个不好的做法。现在,从数学角度来说也是n!>2x(n-1)代码>用于所有n>2
。换句话说,不存在一对来自[1..9]
的数字,因此阶乘和等于10阶乘。没有解决办法。为什么试抓不是好的做法。是的,在我上面的代码中可能不需要try-catch,但是我认为在一些异常情况下使用try/catch是很好的。对于我的问题,我认为你是对的,没有解决方案。如果有任何解决方案,那么我确信我的代码应该给出答案。我只想确认是否有错误,是否有这样的数字的阶乘和等于10!。谢谢。你真的相信10个递归调用会导致堆栈溢出吗?你有其他假设吗?不,我不需要假设-我知道答案。:)然后把它寄出去?我很好奇
private int findFactorial(int n)
{
int fact = 0;
try
{
if(n==0 || n==1)
{
fact= 1;
}
else
{
fact= n * findFactorial(n - 1);
}
return fact;
}
catch (Exception ex)
{
throw ex;
}
}