使用递归来乘以一个没有局部变量的数字序列

时间:2017-04-12 14:57:06

标签: java recursion

这是一个过去考试的问题,让我的同学和我都难过:

  

使用递归将一系列中的每个数字相乘,而不使用局部变量。假设:

     
      
  • 参数为正
  •   
  • 第一个参数小于第二个参数
  •   
  • 结果小于2 31
  •   

例如,rangeProduct(1, 5)应该返回120,因为1x2x3x4x5是120

使用此方法签名:

public static int rangeProduct(int valueOne, int valueTwo) {
    return ?;
}

如果有人知道如何做到这一点,那只是为了让我的学习受益,如果你正在寻找一些练习,或者只是对一个饥饿的,知识渊博的计算机科学专业学生感同身受,那就去摇摆!

5 个答案:

答案 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