【发布时间】:2014-04-28 22:19:40
【问题描述】:
我是计算机科学专业的新生,目前我们学习 Java 递归。不幸的是,学院只解释了关于这个主题的以下内容:
- 递归是什么意思。
- 使用递归算法时有两种情况:基本情况和递归情况及其用途。
- 使用递归实现阶乘和斐波那契的示例。
现在我得到了以下练习:
如果两个整数的最大公约数(又名 GTC)ONLY 1”,则它们将被称为“陌生人”。例如,数字 8 和 9 是“陌生人”,因为它们的 GTC 为 1 . 但是,8和9并不是“陌生人”,因为他们的GTC是2。
请实现一个递归方法,它接收一个整数数组,如果这个数组中的每一对数字都是陌生人,则返回“true”,否则返回“false”。
方法签名必须如下:
public boolean checkGCD(int[] values)例如:
{3, 5, 7, 11} -> 方法将返回 true。
{4, 7, 8, 9} -> 方法将返回 false,因为 4 和 8 并不陌生。如需帮助,您可以使用以下方法查找 GTC(欧几里得算法):
private static int gcd(int n, int m){ if (m==0) return n; return gcd(m,n % m); }另外,方法checkGCD(int[] values)应该重载...
不能使用循环!
使用嵌套循环可以很容易地完成上述操作,但我必须使用递归!
我知道我需要使用一个重载方法,它可以获取the array、lo index 和hi index。
这就是我想到的:
@@@@@@
基本情况:如果数组中至少有一对不陌生的数字,则方法返回false(无需继续比较...)。
@@@@@@
比较将通过以下方式进行:lo 索引指向第一个单元格 -> hi 索引指向第二个单元格 -> 比较 -> hi 索引递增 1 直到到达数组的最后一个单元格。
然后,lo 索引加 1,然后重复上述操作。
所以最重要的是,我应该将第一个单元格与所有连续单元格进行比较,将第二个单元格与所有连续单元格进行比较,第三个等...
@@@@@@@@
如果所有数字对都是陌生人,我需要其他东西来停止递归。因此,如果所有对都是陌生人,则意味着 lo 索引和 hi 索引最终将指向最后一个单元格(因为 lo 和 hi 索引都逐渐增加,并且在所有比较结果都正常后它们到达最后一个数组单元格,即陌生人)。
下面是重载的函数:
private static boolean checkGCD(int[] values, int lo, int hi)
{
if ( (gcd(values[lo], values[hi]) )!= 1 )
return false;
else if (lo < values.length-1 && hi < values.length-1)
return checkGCD(values, lo, hi+1);
else if (lo < values.length-2 && hi == values.length-1)
return checkGCD (values, lo+1, lo+2);
if (lo == values.length-1 && hi == values.length-1)
return true;
} -> Compiler says "missing return statement"**
以下是练习需要的方法,它基本上只是调用重载的方法,递归地做所有事情。
public static boolean checkGCD(int[] values)
{
return checkGCD(values, 0, 1);
}
当我尝试编译时,我得到“缺少返回语句”,它指向重载函数中的右括号
但我确实在重载函数中使用了“return”。
请说明如何解决。我确定编译错误后,上面的重载函数仍然不行。
【问题讨论】:
-
这个问题似乎跑题了,因为它是关于家庭作业的。
-
标题一定要描述问题>>stackoverflow.com/help
-
@LutzHorn:家庭作业问题不是题外话。不具体、过于宽泛的问题是题外话,但这似乎不适用于这种情况。
-
那么 8 和 9 是陌生人,但他们也不是陌生人?这听起来不对……
-
嗨,恕我直言,我想了解递归的工作原理,练习只是工具。我不关心解决方案。请指教。