没有局部变量的java中的递归

时间:2012-12-06 11:22:35

标签: java recursion

我目前正在审查一位同事的一些代码,并发现了一种我从未见过的递归用法。

我减少了它,所以他基本上做的是:

public class Main {
    static class Test {
        private static final int MAX = 10;

        private int mValue = 0;

        void test() {
            System.out.println( mValue );
            mValue++;
            if (mValue < MAX) {
                test();
            }
        }
    }

    public static void main( final String[] args ) {
        final Test test = new Test();
        test.test();
    }
}

当我使用递归时,我会将所有需要的变量作为参数,然后使用返回值返回某些内容,或者使用其中一个参数来提供可以写入结果的容器对象。这样每次递归拥有自己的数据范围。

我环顾四周,但网上的每个例子都按照我的方式进行。

这会导致任何错误吗?对象中有些不一致吗?这与调用成员变量的不同私有方法有区别吗?

brgds,

Ĵ

4 个答案:

答案 0 :(得分:2)

只要Test类的单个实例不会同时运行.test(),这将按预期工作。

修改

@Itay让我意识到,“同时”这个词在这里是错误的 - 它应该是“竞争性地”在“不与彼此合作或不相互了解”的意义上。对不起,德语(我的母语)单词“Konkurrenz”和英语单词“Concurrency”的含义略有不同。

<强> /修改

如果这是有保证的,将mValue放在类范围而不是本地范围中可以提高局部性和缓存命中率,也可以删除一些参数传递 - 总而言之,它会对封装进行一些性能提升。

答案 1 :(得分:1)

只要您的逻辑是线程安全的(不可变对象或包含相关锁定),即使发生递归,也没有理由严格优先于全局类'字段上的参数。

当然,只要相关字段代表对象的状态而不是简单的丑陋辅助变量......

答案 2 :(得分:0)

如果在同一个实例上调用两次递归方法,可能会出现问题吗?

答案 3 :(得分:0)

  

这会导致任何错误吗?对象中有些不一致吗?

实际上,它不是实现递归的首选方法。

条件(mValue < MAX)只应在递归方法中受到影响。如果没有,你的递归可能会无意中结束。