2011-11-01 129 views
0

使用递归如何保持局部变量更新直到满足条件。我在下面有一个实例解释了为什么问题很好。计数变量是一个局部变量,方法通过计数的时间设置为0.我不能将计数移到方法以外,它必须是局部变量而不是静态或其他任何东西。所需的输出应该是(3 6 )使用递归如何保持局部变量更新

public static int returnInt(int b) { 

     int count = 0; 

     if (b == 6) { 

      System.out.println(count + " " + b); 
     } 

     b += 2; 
     count++; 

     return returnInt(b); 

    } 
+1

为什么你不允许改变任何东西? – DaveJohnston

+3

不是'count'只是'int count == b/2;'?否则,你必须将'count'变量传递给递归函数。 – Andre

+5

你知道'returnInt'永远不会返回任何东西,对吧? :-)因为它会在堆栈溢出崩溃之前停止。 (递归算法**必须**有一个退出子句。) –

回答

5

count作为附加参数的方法:

public static int returnInt(int b, int count) { 

    ... do some stuff to b, print something, check whether end-condition has been met ... 

    return returnInt(b, count + 1); 
} 

然后,调用returnInt0一个额外的参数要开始做事了。

+2

...并添加提供终止条件的逻辑。 :-) –

+0

@TJCrowder - '检查结束条件是否得到满足' –

+0

'@Matt:'“...并返回”:-) –

1
public static int returnInt(int b) { 
    return returnInt(b, 0); 
} 

private static int returnInt(int b, int count) {  
    if (b == 6) { 
     System.out.println(count + " " + b); 
     // My guess is you should be returning something here??? 

     // Actually, this shouldn't be your exit point from the recursion because depending on the starting value of b, since you are always adding 2, it might never equal 6, so again you would get a StackoverflowException. 
    }  
    b += 2; 
    count++; 

    return returnInt(b, count); 
} 
+0

我的回答是对发布的代码的反思,TJ Crowder提出了重要的一点是,这永远不会回来。 – DaveJohnston

1

你不能。根据定义,局部变量是本地的。它只存在于该方法当前执行的范围内。

但是你有以下解决方案。

最好的一个是把它作为你的方法(完全是你做其他参数b

public static int returnInt(int b) { 
    return returnInt(b, 0) 
} 
private static int returnInt(int b, int count) { 
    // your code here. 
} 

如果(对于一些奇怪的原因),你不能改变方法签名,你可以把一个参数该变量为ThreadLocal。在这种情况下,即使多个线程同时执行的方法,你的代码保持线程安全的。

移动这个变量一流水平的原因是最坏的解决方案不是线程安全和休息封装。

1

这个函数会溢出你的堆栈。使用递归时,您必须提供出路。至于变量计数,你每次都将它重新定义为0。它不能在递归函数中初始化。尝试将它作为参数传递给你的函数,并为你的函数提供一个出路。

public static int returnInt(int b,int count) { 

    if (b == 6) { 

     System.out.println(count + " " + b); 
     return b; 
    } 
    b+=2; 
    count++; 
    return returnInt(b); 
} 

'返回b'行可能是你的出路......而你不一定必须返回b ...返回你需要的任何东西。

+0

请注意,如果最初使用b作为奇数或已经大于6来调用此方法,那么退出条件永远不会被满足,所以其他事情必须改变。 – DaveJohnston

+0

这是真的,这只是一个例子来展示如何退出递归方法 – PTBG

0

一般来说,创建returnIntInner(int b,盒装数),将大部分逻辑移动到该位置,然后从“精简”版本的returnInt中调用该逻辑。为了框count“旧样式”的方式是将count作为int [1]数组传递,以便它可以返回 - 我没有研究过新的Java引用parm语法。但由于您的代码是递归调用,并且在递归调用后不需要访问count,所以您可以简单地将count作为常规参数传递。