这是一个过去考试的问题,让我的同学和我都难过:
使用递归将一系列中的每个数字相乘,而不使用局部变量。假设:
- 参数为正
- 第一个参数小于第二个参数
- 结果小于2 31
例如,rangeProduct(1, 5)
应该返回120
,因为1x2x3x4x5是120
使用此方法签名:
public static int rangeProduct(int valueOne, int valueTwo) {
return ?;
}
如果有人知道如何做到这一点,那只是为了让我的学习受益,如果你正在寻找一些练习,或者只是对一个饥饿的,知识渊博的计算机科学专业学生感同身受,那就去摇摆!
答案 0 :(得分:3)
试试这个:
public static int rangeProduct(int valueOne, int valueTwo) {
if(valueOne>=valueTwo)
return valueOne;
return rangeProduct(valueOne, valueTwo-1) * valueTwo;
}
按照您指定的确切顺序执行计算:
1x2=2, 2x3=6, 6x4=24, 24x5=120
答案 1 :(得分:0)
我认为这可以解决您的问题:
public static int rangeProduct(int valueOne, int valueTwo)
{
if(valueOne <= valueTwo -1){
valueOne++;
return (valueOne-1) * rangeProduct(valueOne, valueTwo);
}
return valueTwo;
}
答案 2 :(得分:0)
model.p
为了减少递归调用的数量,可以减少一方的大小
public static int rangeProduct(int valueOne, int valueTwo)
{
// to avoid infinite loop if valueOne must be less or equal valueTwo
if (valueOne > valueTwo) {
throw new IllegalArgumentException();
}
// terminal case : return one over two values
if (valueOne == valueTwo) {
return valueOne;
}
// recursive call with range's size decreasing
return valueOne * rangeProduct(valueOne+1, valueTwo);
}
答案 3 :(得分:0)
这应该不难。
让我们先迭代地解决这个问题。
public static int rangeProduct(int valueOne, int valueTwo)
{
int prod = 1;
for(int i = valueOne; i <= valueTwo; i++) {
prod *= i;
}
return prod;
}
这样做递归就是这么简单:
public static int rangeProduct(int valueOne, int valueTwo)
{
if (valueOne ==0 || valueTwo == 0) return 0;
//Range check
if (valueOne > valueTwo) return rangeProduct(valueTwo, valueOne);
if (valueOne < 0 && valueTwo > 0) return 0; //Because 0 is always in this range
if (valueOne == valueTwo) return valueTwo;
return valueTwo*rangeProd(valueOne, valueTwo-1);
}
用于递归的逻辑:假设你有一个范围(3,5)然后:
(3,5)= 5 *(3,4)= 5 * 4 *(3,3)= 5 * 4 * 3 = 60
(-3,-1)= -1 *( - 3,-2)= -1 * -2 *( - 3,-3)= -6
(-3,5)= 0(因为该范围包括0)
(5,3)与(3,5)相同,所以这也可以返回60。
(3,3) - &gt;现在,如果两者都不相同,答案基本上是3。
希望这有帮助!
答案 4 :(得分:0)
这是一个单行:
public static int rangeProduct(int valueOne, int valueTwo) {
return valueOne * (valueOne == valueTwo ? 1 : rangeProduct(++valueOne, valueTwo));
}
请参阅live demo。