Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:递归方法期间堆栈溢出异常_C#_Random_Stack_Overflow - Fatal编程技术网

C#:递归方法期间堆栈溢出异常

C#:递归方法期间堆栈溢出异常,c#,random,stack,overflow,C#,Random,Stack,Overflow,我有一个递归方法,每当随机生成的数字不等于1时,就会调用它自己。 我正在尝试测试不同事物的几率,例如闪亮的口袋妖怪(1/8192)或Minecraft中的12眼种子(10^12),尽管我理解堆栈溢出的原因,但我不知道如何修复它。使用线程会大大降低计算速度(不使用线程时为5000次计算/秒,使用线程时为500次左右) 代码如下: static void() { 总数=0; 计数器+=1; 重置计数器+=1; if(rdm.Next(8192)+1==1) { 控制台.WriteLine(“闪亮!!

我有一个递归方法,每当随机生成的数字不等于1时,就会调用它自己。 我正在尝试测试不同事物的几率,例如闪亮的口袋妖怪(1/8192)或Minecraft中的12眼种子(10^12),尽管我理解堆栈溢出的原因,但我不知道如何修复它。使用线程会大大降低计算速度(不使用线程时为5000次计算/秒,使用线程时为500次左右)

代码如下:

static void()
{
总数=0;
计数器+=1;
重置计数器+=1;
if(rdm.Next(8192)+1==1)
{
控制台.WriteLine(“闪亮!!在:“+计数器+”重置“);
}
其他的
{
如果(重置计数器>7000)
{
控制台写入线(“重置。当前:+计数器);
ThreadStart newtask=新的ThreadStart(闪亮);
线程任务=新线程(newtask);
task.Start();
}
其他的
{
控制台写入线(“重置。当前:+计数器);
闪亮的();
}
}
}
我使用resetcounter变量来避免堆栈溢出错误,因为它发生在7k“resets”左右,然后启动一个新线程。
我很想了解测试赔率是如何避免堆栈溢出的

了解一些背景信息。C#和许多其他语言在调用方法时使用a,这用于局部变量、返回值和其他内容。因此,当您调用一个方法时,堆栈的大小将增加,而当该方法返回时,堆栈的大小将减少相同的数量。最大大小通常为1-4Mb,当使用递归代码而没有定义好的最大深度时,很容易达到

递归函数可以重新编写为迭代函数。有些情况下需要一个更大的显式表达式,但在这种情况下不需要。示例代码(减去线程)可以重写如下:

    void shiny()
    {
        while (rdm.Next(8192) != 0)
        {
            counter += 1;
        }
        Console.WriteLine("SHINY !! In: " + counter + " resets.");
    }

虽然这样的实验很有趣,但你可以明确地计算概率。假设在一轮中发现一个发光体的几率为8192分之一,或0.012%,则在n轮后发现至少一个发光体的几率为1-(8191/8192)^n。把它放到wolfram alpha中,你会得到一个。

的背景信息。C#和许多其他语言在调用方法时使用a,这用于局部变量、返回值和其他内容。因此,当您调用一个方法时,堆栈的大小将增加,而当该方法返回时,堆栈的大小将减少相同的数量。最大大小通常为1-4Mb,当使用递归代码而没有定义好的最大深度时,很容易达到

递归函数可以重新编写为迭代函数。有些情况下需要一个更大的显式表达式,但在这种情况下不需要。示例代码(减去线程)可以重写如下:

    void shiny()
    {
        while (rdm.Next(8192) != 0)
        {
            counter += 1;
        }
        Console.WriteLine("SHINY !! In: " + counter + " resets.");
    }

虽然这样的实验很有趣,但你可以明确地计算概率。假设在一轮中发现一个发光体的几率为8192分之一,或0.012%,则在n轮后发现至少一个发光体的几率为1-(8191/8192)^n。把它扔进wolfram alpha,你会得到一个。

为什么这个循环是递归的,而不是一个带中断条件的简单循环?哦,我没想到,我想我是个小脑袋哈哈!这个循环确实有效,谢谢!为什么这个循环是递归的,而不是一个带中断条件的简单循环?哦,我没想到,我想我是个小脑袋哈哈!这个循环确实有效,谢谢!