2016-10-02 1 views
0

Я правильно отсканировал число, но методы не работают правильно. Первый ничего не делает, а второй - в бесконечный цикл.Почему метод не действует «правильно?»

Вызывается метод неправильно. Я не уверен что делать.

import java.util.Scanner; 
public class testSequence { 

public static void main(String[] args) { 
    Scanner scan = new Scanner(System.in); 
    System.out.println("Enter a number: "); 
    int enterNumber = scan.nextInt(); 
    System.out.println("1 for Iteration, 2 for Recursion: "); 
    int type = scan.nextInt(); 

    if (type == 1){ 
     computeIteration(enterNumber); 
    } else if (type == 2){ 
     computeRecursion(enterNumber); 
    } 
} 


public static int computeIteration(int enterNumber) { 
    int answer; 
    int multiplier = 1; 
    int count = 0; 
    int addend = 0; 
    if (enterNumber == 0) { 
     count++; 
     return enterNumber; 
    } else if (enterNumber == 1) { 
     count++; 
     return enterNumber; 
    } else { 

     for (int i = 0; i <= enterNumber; i++) {//need to adjust "i" for counter correction 

      enterNumber = (multiplier * 2) + addend; 
      addend = multiplier; 
      multiplier = enterNumber; 
      count += 1; 
     }//end for loop 
     answer = enterNumber; 
    }//end else 
    return answer; 
}//end computeIteration 

public static int computeRecursion(int n) { 
    int count = 0; 
    if (n == 0) { 
     count++; 
     return 0; 
    } else if (n == 1) { 
     count++; 
     return 1; 
    } else { 
     count++; 
     return computeRecursion(2 * (n - 1)) + computeRecursion(n - 2); 
    } 

}//end computerRecursion() 

}//end Sequence() 
+0

Я вижу, что вы вызываете 'computeIteration', но тогда вы ничего не делаете с результатом. Может ли быть частью проблемы? – ajb

+0

Вы увеличиваете количество просмотров в нескольких местах в обоих методах, но вы не используете его. – Murillio4

+0

Murillio4 Я знаю это, спасибо. Меня больше интересует, почему метод работает неправильно. @ajb предполагается вернуть ответ, но ответ не отображается вообще. – platypus87

ответ

0

Вы никогда не печатаете ответ.

if (type == 1){ 
     computeIteration(enterNumber); 
    } else if (type == 2){ 
     computeRecursion(enterNumber); 
    } 

Обратите внимание, как вы вызываете функции, но вы ничего не делаете с результатом.

вероятно Вы имели в виду:

if (type == 1){ 
    System.out.println(computeIteration(enterNumber)); 
    } else if (type == 2){ 
    System.out.println(computeRecursion(enterNumber)); 
    } 

Или, если вы хотите получить фантазии:

UnaryOperator<Integer> f = 
    type == 1 ? 
     computeIteration 
     : computeRecursion; 

System.out.println(f.apply(enterNumber)) ; 

просто прибавление, так как вы просили. Я использую тернарный оператор, потому что мне нужно выбирать между двумя вещами. В случае, подобном этому, он более аккуратный, чем полный оператор if.

UnaryOperator - это функциональный интерфейс. В основном, используя их, вы можете сохранить функцию внутри переменной. Это полезно, когда в таких случаях вы хотите выбрать между двумя функциями, чьи подписи одинаковы (обе ваши функции принимают int и возвращают int), и используют результат.

Я сохраняю одну из ваших функций в f, а затем назову ее путем записи f.apply(9) (apply «применяет» аргументы функции, называя ее).

Обратите внимание: вы не должны использовать функциональные интерфейсы только для ударов, так как они могут сделать код менее понятным. При правильном использовании, они могут сделать код много проще; особенно в сочетании с анонимными функциями.

+0

Вот что я делал неправильно. Спасибо за помощь!! – platypus87

+0

какой внизу на самом деле? Это выглядит намного более продвинутым, чем я когда-либо видел (что не так много). Он похож на то, что я знаю как третичный оператор из «C». Я даже близко? – platypus87

+0

@ platypus87 Я., тернарный оператор - всего лишь тернарный оператор. Работает одинаково. Я напишу краткое описание того, что все остальное делает немного. – Carcigenicate