【问题标题】:Calling a method three times the most basic way you can调用一个方法三遍最基本的方法
【发布时间】:2016-05-14 20:14:39
【问题描述】:

我想知道是否有多次调用方法的基本方法。我不允许使用 for、if 或 else 语句。我想写一个叫做test 1和test 2的方法,它把速度增加和速度减少3倍。如果有人能给我建议,我将不胜感激。

要求

提高速度。 increaseSpeed 方法应该将速度加 10 每次调用它的字段。

降低速度。 reduceSpeed 方法应该从速度中减去 10 每次调用它的字段。

编写一个名为 test1 的方法,该方法调用 increaseSpeed 3 次。

编写一个名为 test2 的方法,该方法调用了 3 次 reduceSpeed。

程序:

 public void increaseSpeed()
   {
      speed += 10;
   }

   public void reduceSpeed()
   {
      speed -= 5;
   }
   public void test1(){

   }

   public void test2(){

   }

}

【问题讨论】:

标签: java


【解决方案1】:

您可以使用while 循环模拟for 循环:

public void test1() {
    int i = 0;
    while (i < 3) {
        increaseSpeed();
        ++i;
    }
}

或者,如果您根本不允许使用循环,您可以调用 increaseSpeed 三次:

public void test1() {
    increaseSpeed();
    increaseSpeed();
    increaseSpeed();
}

【讨论】:

  • 甚至while (i++&lt;3) increaseSpeed();
【解决方案2】:

我们也可以变得更有创意(也就是毫无意义):

第一个示例需要 Java 8,但它是一个美化的 FOR 循环。如果您不喜欢“for”一词,则可以将“forEach”替换为具有忽略输出或其他 Java 流处理项之一的 map() 或 filter()。

private static void test1() {
    IntStream.range(0, 3).forEach(
            i -> increaseSpeed()
    );
}

第二个示例使用 switch + 递归,因为您也没有提及任何关于“switch”语句的内容。

private static final int INITIAL_COUNT = 2; // 3 - 1
private static int numTimes = INITIAL_COUNT;

private static void test2() {
    switch(numTimes) {
        case 0:
            numTimes = INITIAL_COUNT;
            break;
        default:
            numTimes--;
            test2();
            break;
    }
    reduceSpeed();
}

请注意,如果您尝试将其中任何一个提交给代码审查,您将被拒绝,除非该项目由不关心代码质量的小丑运行:)

【讨论】:

    【解决方案3】:

    你没有提到while loop被禁止,我认为可以使用它:

    int i = 0;
    while(i<3){
        increaseSpeed();
        i++;
    }
    

    或者,您可以使用do-while loop 来实现您的要求或调用该方法 3 次..

    【讨论】:

      【解决方案4】:
      public void test1(){
          increaseSpeed();
          increaseSpeed();
          increaseSpeed();
      }
      
      public void test2(){
          decreaseSpeed();
          decreaseSpeed();
          decreaseSpeed();
      }
      

      有关更通用的“解决方案”和技巧,请查看以下内容:C: Looping without using looping statements or recursionhttps://codegolf.stackexchange.com/questions/33196/loop-without-looping.

      【讨论】:

        【解决方案5】:

        使用给定的方法,最有效和最简单的方法是连续调用 3 次:

        public void test1() {
           increaseSpeed();
           increaseSpeed();
           increaseSpeed();
        }
        
        
        public void test2() {
           decreaseSpeed();
           decreaseSpeed();
           decreaseSpeed();
        }
        

        一种更灵活的方法是使用递归调用,如下所述:

        public void test1() {
           increaseSpeed(3);
        }
        
        public void test2() {
           decreaseSpeed(3);
        }
        
        private void increaseSpeed(int numTimes) {
           if (numTimes == 0) {
               return;
           }
        
           increaseSpeed();
           increaseSpeed(numTimes-1);
        }
        
        private void decreaseSpeed(int numTimes) {
            if (numTimes == 0) {
                return;
            }
        
            decreaseSpeed();
            decreaseSpeed(numTimes-1);
        }
        

        稍微超出这个问题,如果这些测试模拟了一个真实的用例,那么审查方法 increaseSpeed() 和 reductionSpeed() 以防止这些多次调用可能是个好主意。

        【讨论】:

          【解决方案6】:

          你的 test1 方法应该是递归的,它应该接受一个 Integer 作为参数,这将是你想要调用的次数 所以基本上你应该有这样的东西:

          public void test1(int nbcalls) {
            if (nbcalls-- > 0) {
               increaseSpeed();
               test1(nbcalls);
            }
          }
          

          你这样称呼你的方法:

          test1(3);
          

          你应该对 test2(...) 方法做同样的事情

          【讨论】:

          • OP:我不允许使用 for、if 或 else 语句。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-09
          • 1970-01-01
          • 2019-12-06
          相关资源
          最近更新 更多