java 递归有次数限制吗,小心递归次数限制

最近, 我在 review 组员的 Python 代码时, 发现了一个递归调用, 我立即发现了其中的问题.

先说一下编程中递归. 只有会用递归, 并且能随心应手地写出递归程序的程序员, 才是已经入门了的程序员. 不过, 许多程序员并没有发现编程中的递归的一个限制: recursion depth limit, 逻辑上的递归可以无次数限制, 但语言执行器或者程序堆栈会限制递归的次数.

例如一个 Cpy 编程语言(用 C 语法写 Python 代码)例子:

function func(i){

if(i < 1000000){

try{

func(i + 1);

}catch(Exception e){

print \'maximum recursion depth exceeded\', i;

print e;

return;

}

}

}

func(1);

因为 Python 语言有递归次数的限制, 试验结果是 997 次.

sys.setrecursionlimit( limit)

而 C 语言的限制, 是程序堆栈的大小限制, 超过之后, 会产生 stack overflow. 比如下面这个 C 语言的例子在我的环境下只递归了 511 次:

void func(int i){

int buf[1000];

if(i < 100000){

printf("depth = %d\\n", i);

func(i + 1);

}

}

int main(int argc, char **argv){

func(1);

return 0;

}

再回到最先开始提到的, 我 review 发现的例子, 我为什么能一眼就发现那个递归有问题呢. 因为, 那段代码是一段按行分析文本的程序, 当发现某一行不符合条件时, 程序会递归调用分析函数递归地分析下一行. 显然, 如果连续 997 行文本不符合条件, Python 程序就会崩溃退出了.

转自:http://blogread.cn/it/article/5665?f=hot1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值