我在玩Java的一些实践问题。我为下面给出的程序编写了一个递归程序。我的解决方案是正确的,除了已暂停(我相信)恢复为活动状态并更改递归方法的值。我还添加了调试模式下的Eclipse屏幕快照,其中显示了线程堆栈。
package com.nix.tryout.tests;
/**
* For given two numbers A and B such that 2 <= A <= B,
* Find most number of sqrt operations for a given number such that square root of result is a whole number and it is again square rooted until either the
* number is less than two or has decimals.
* example if A = 6000 and B = 7000, sqrt of 6061 = 81, sqrt of 81 = 9 and sqrt of 9 = 3. Hence, answer is 3
*
* @author nitinramachandran
*
*/
public class TestTwo {
public int solution(int A, int B) {
int count = 0;
for(int i = B; i > A ; --i) {
int tempCount = getSqrtCount(Double.valueOf(i), 0);
if(tempCount > count) {
count = tempCount;
}
}
return count;
}
// Recursively gets count of square roots where the number is whole
private int getSqrtCount(Double value, int count) {
final Double sqrt = Math.sqrt(value);
if((sqrt > 2) && (sqrt % 1 == 0)) {
++count;
getSqrtCount(sqrt, count);
}
return count;
}
public static void main(String[] args) {
TestTwo t2 = new TestTwo();
System.out.println(t2.solution(6550, 6570));
}
}
上面的屏幕截图来自我的调试器,我圈了Thread堆栈。任何人都可以尝试运行该程序,让我知道问题出在哪里,解决方案是什么?我可以提出一种非递归的解决方案。
答案 0 :(得分:1)
您的代码有误,您应该有
return getSqrtCount(sqrt, count);
代替
getSqrtCount(sqrt, count);
否则,递归是没有意义的,您将完全忽略递归的结果。
答案 1 :(得分:1)
您的递归是错误的,因为count
的值在任何情况下都将返回0
或1
,即使它深入到递归调用中也是如此。 Java是按值传递的,这意味着修改方法内部的原语值不会在该方法外部可见。为了纠正这一点,我们可以编写以下递归:
private int getSqrtCount(Double value) {
final Double sqrt = Math.sqrt(value);
if((sqrt > 2) && (sqrt % 1 == 0)) {
return getSqrtCount(sqrt) + 1;
}
return 0;
}