6

递归是否会对处理器和内存造成严重影响?我的意思是,我的一个线程有一个方法,很可能会调用它自己。假设它每秒可以自调用一次。我的应用程序应该至少运行 24 小时而不会停止,因此它提供了 (60*60*24) 86400 个自调用方法。

它如何影响第二个(主)线程?

对不起我的英语不好,也没有代码,但我不是在家写的。

4

4 回答 4

7

如果在第 86400 次调用之前没有返回语句将结束递归调用字符串,则很可能由于堆栈上的递归调用过多而导致堆栈溢出错误。如果可能,请尝试实施迭代解决方案。

于 2012-08-07T20:24:52.970 回答
4

递归调用在内存方面非常低效。
这是因为每个递归调用都会向堆栈添加一个新帧,因此对于N调用,您有O(N)内存要求。
递归方法通过简单的代码以非常简单的方式(例如遍历树)解决难题。
不利的一面是,如果您不知道自己在做什么,则可能由于递归调用过多而导致内存不足。
因此,如果您知道可以递归解决问题但需要太多递归,请尝试迭代地实现它(大多数但不是所有递归算法都可以转换为迭代算法)

例子。在我的 Windows 32 位 (4GB) 中,以下内容Exception in thread "main" java.lang.StackOverflowError在 7380 之后调用

public static void recursing( int n ){
        System.out.println(n++);
        recursing(n);
}  
public static void main(String[] args) {
    recursing(1);

}
于 2012-08-07T20:35:50.940 回答
1

我不确定它是否适合您的问题,但听起来调度程序可能很有用,因为您基本上是在说它应该每秒运行一次。您可以尝试使用Quartz Scheduler

您可以创建一个 Job,然后使用简单的触发器或 cron 触发器告诉它永远每秒运行一次。石英文档

于 2012-08-07T20:31:13.277 回答
1

在 Java 中,使用循环通常比使用递归更有效。在某些情况下,递归是最有效的。

一个处理器每秒可以轻松进行 1000 万次调用或每天数万亿次调用。86400 不是很多,我不会担心。

假设它每秒可以自调用一次。

这没有多大意义。使用循环是一种很重要的方法。仅当您打算在完成后返回时才使用递归。

于 2012-08-07T20:51:21.547 回答