C#函数无限递归

问题描述

对C#不熟悉,想请问一下,c#中如果一个函数无限递归,会怎么样?

解决方案

解决方案二:
递归到无法分配栈内存时,程序就奔溃了呗
解决方案三:
while(true){}跟着效果应该差不多
解决方案四:
内存溢出,程序崩
解决方案五:
运行到内存溢出,然后奔溃~
解决方案六:
引用2楼u013053259的回复:

while(true){}跟着效果应该差不多

完全不一样while循环只不过是吃cpu无限递归会吃内存因为每递归一次,之前的也不会释放,依然保留着,好等你递归完了再一层一层的退出出来
解决方案七:
List<double>l=newList<double>();while(true){l.add(0.0f);}你要是说跟这个差不多还有点靠谱只往里加,永远不删除,总有内存溢出的时候
解决方案八:
func<int,int>func=null;func=c=>fun(c-1)+c;//没有退出条件intres=func(100000);

运行这个你试试看是什么效果
解决方案九:
理论上每次调用函数都会将其地址加载到堆栈上,所以都有次数限制拿个简单例子来说:staticintTest(inti){if(i<-500000){return1;}returnTest(i-1)+i;}

Test(i-1)+i因为有+i的运算,需要把上一次递归的结果暂存到一个临时变量,加载到栈上,随着次数的增加,会占用越来越多的堆栈,而线程的堆栈是有限的(默认1M)不过编译器可以优化尾递归形式(函数直接返回自身的调用),右侧改为returnTest(i-1),这样就不需要临时变量(func的地址是固定的),编译器就可以将其优化成循环,跳转到原地址,传入新的参数在工程属性中勾选“允许优化代码”后(或者Release生成),就不会溢出了,不勾选就溢出LS的代码由于没有退出条件,优化后将造成死循环
解决方案十:
一般来说结果就是StackOverflowException导致程序结束。不过具体行为不仅和程序有关,还和编译器还有jit有关。调用有一种,它可以进行优化,调用时其实当前方法已经结束,就可以先对栈进行处理再调用。这种对递归来说就是尾递归,不需要栈不停增长。IL有tail指令来通知jit尾递归,但是C#的编译器不会产生这个指令(F#的编译器会),而是jit自动根据情况优化,只有release方式编译后,在64位jit的执行才支持。clr4对尾调用又进行过。比如以下最简单的递归,如果是Release模式64位运行,就会无限循环,类似于while(true),而其它方式运行都会stackoverflowpublicstaticvoidR(){R();}

但是自己也无法确定jit会不会进行尾调用优化,而且StackOverflowException是无法catch的,会直接导致程序结束。所以数据量大时要自己根据情况控制好递归深度,避免栈溢出。或者转化成不使用递归的算法。
解决方案十一:
编译没问题,执行的时候会报错。C#递归深度有限制的。
解决方案十二:
哈,我比较好奇楼主为什么会有这么个问题怎么想“无限”递归都是件耗资源耗CPU的事,程序跑“累了”就会理所当然地崩掉,但是不会影响到系统。
解决方案十三:
引用10楼yuwenge的回复:

编译没问题,执行的时候会报错。C#递归深度有限制的。

C/C++一样的,都用的堆栈模型
解决方案十四:
堆栈溢出。你使用的局部变量越多,递归的层数越少。递归的层数没有限制,限制是堆栈的大小,默认CLR使用4MB的堆栈。
解决方案十五:
引用2楼u013053259的回复:

while(true){}跟着效果应该差不多

效果差别很大。这个会无限循环下去,但递归不会无限,而是会在栈溢出后抛出异常。
其他方案:
无限递归会导致栈溢出,系统随即抛出OverflowException
其他方案:
引用13楼caozhy的回复:

堆栈溢出。你使用的局部变量越多,递归的层数越少。递归的层数没有限制,限制是堆栈的大小,默认CLR使用4MB的堆栈。

我记得好像有次我写的递归,在运行的时候深度过深报错是“递归深度超过32层”,递归的深度应该是32层,在不进行设置的情况下
其他方案:
引用16楼ta_wuhen的回复:

Quote: 引用13楼caozhy的回复:
堆栈溢出。你使用的局部变量越多,递归的层数越少。递归的层数没有限制,限制是堆栈的大小,默认CLR使用4MB的堆栈。

我记得好像有次我写的递归,在运行的时候深度过深报错是“递归深度超过32层”,递归的深度应该是32层,在不进行设置的情况下

好把,我记错了,32层是数据库里的。。。C#是堆栈溢出来结束无限递归的
其他方案:
边界不确定的情况下用递归是作死的节奏啊!无论还崩溃还是默默死循环,结果没什么本质不同,都是跑不下去了呗。

时间: 2024-09-20 10:36:10

C#函数无限递归的相关文章

PHP 无限分类三种方式 非函数的递归调用!_php技巧

php无限分类大致有三种方式, 1.数据库通过设置父类ID来进行唯一索引,然后使用函数的递归调用实现无限分类: 2.数据库设计通过特定格式进行排列,然后使用mysql查询关键函数:concat.程序实现比较简单: 3.第三种不是太了解, 好像要使用到算法和数据结构进行排列. 今天我主要分享下第二种方式,一开始也是找了很多资料,确实比较难理解.不过最终还是给搞明白了,因此记下随笔,希望通过这篇文章能够帮助到大家. 一.数据库设计: 复制代码 代码如下: -- -- Table structure

归并-关于无限递归的问题。

问题描述 关于无限递归的问题. 我在写归并排序时需要写一个递归实现,结果无限递归了,代码类似下面: void fun(int a, int b) { int mid; if (a < b) { mid = (a + b)/2; fun (a,mid); fun (mid,b); } } 我用vS2010试了一下,好像没问题,怎么回事? 求解? 解决方案 第一次mid = (a + b)/2,再fun (a,mid);mid肯定大于a,然后mid=(a + mid)/2,迭代到最后mid=a,fu

php函数的递归调用

什么是函数的递归调用?就是函数自己调用自己. php文件: <?phpfunction abc($n) { if ($n > 2) { abc(--$n); } echo '$n=' . $n . "<br />";}abc(4);?> 输出结果: $n=2 $n=2 $n=3 以上是小编为您精心准备的的内容,在的博客.问答.公众号.人物.课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索php , 递归 , 文件 , 函数 , 结果 输出 函数

PHP中实现无限递归菜单

这几天看到TP里关于无线分类搞得蛮火的,各种代码乱飞.我也发布一个我的思路.使用的是递归,代码很简洁,十行左右. 我的数据库结构是这样的,我的栏目只有一张表. cid fatherid name 主键 父栏目标识 名称 我看到,很多教程里说使用类似0-1-2-3这样的路径法,还有lv=3的层次法,其实大致都一样,只是实现的方式不同而已.我的方法使用的是递归,也比较好理解. 直接上代码了: //首先做一个类内的变量,存储一下相关的数组: public $tree = null; //然后做个测试方

C语言函数的递归和调用

C语言中的函数可以递归调用,即:可以直接(简单递归)或间接(间接递归)地自己调自己. 要点: 1.C语言函数可以递归调用. 2.可以通过直接或间接两种方式调用.目前只讨论直接递归调用. 二.递归条件 采用递归方法来解决问题,必须符合以下三个条件: 1.可以把要解决的问题转化为一个新问题,而这个新的问题的解决方法仍与原来的解决方法相同,只是所处理的对象有规律地递增或递减. 说明:解决问题的方法相同,调用函数的参数每次不同(有规律的递增或递减),如果没有规律也就不能适用递归调用. 2.可以应用这个转

C语言函数的递归和调用实例分析

一个函数在它的函数体内调用它自身称为递归调用.这种函数称为递归函数.C语言允许函数的递归调用.在递归调用中,主调函数又是被调函数.执行递归函数将反复调用其自身,每调用一次就进入新的一层   一.基本内容: C语言中的函数可以递归调用,即:可以直接(简单递归)或间接(间接递归)地自己调自己. 要点: 1.C语言函数可以递归调用. 2.可以通过直接或间接两种方式调用.目前只讨论直接递归调用. 二.递归条件 采用递归方法来解决问题,必须符合以下三个条件: 1.可以把要解决的问题转化为一个新问题,而这个

函数与递归:搜索单链表最后一个结点

问题描述 函数与递归:搜索单链表最后一个结点 LinkNode * FindRear(LinkNode *f){ if(f==NULL) return NULL; else if(f–>link==NULL) return f; else return FindRear(f->link); }函数体中第二行代码是递归终止条件,第三行是调用自己简化问题.那么第一行代码if(f==NULL) return NULL;是干啥的?可以去掉吗? 解决方案 异常处理,输入的参数就是Null的话就要立即返回

c++-求助这个函数的递归怎么理解,我是初学者,谢谢!

问题描述 求助这个函数的递归怎么理解,我是初学者,谢谢! #include<iostream>#include<Windows.h>using namespace std;int age(int);int main(){ cout<<age(5)<<endl; system(""pause""); return 0;}int age(int n){ int c; if(n == 1) { c = 10; cout<

java 递归 树形结构-跪求∶用JAVA递归写数形结构,每级只需要一个树枝节点,无限递归,谢谢

问题描述 跪求∶用JAVA递归写数形结构,每级只需要一个树枝节点,无限递归,谢谢 用JAVA递归写数形结构,每级只需要一个树枝节点,无限递归,谢谢 解决方案 伪代码:void printNode(Node node){ for (Node cn in node.childNodes()) { printfNode(cn); } println(node.data);}