Почему мой метод возвращает неправильное значение? - PullRequest
0 голосов
/ 25 февраля 2019

Несмотря на то, что мой метод operationsNeeded выводит правильное значение для моего return-int "count1", в следующей строке он возвращает что-то еще в мой основной метод.Я не включил остальную часть своего кода, при необходимости я бы с радостью предоставил его.Например, если operationsNeeded выполняется 4 раза, count1 находится на 4, что также распечатывается.Но по неизвестным мне причинам System.out.println ("check:" + count1);Оператор выполняется 4 раза следующим образом:
проверка: 4
проверка: 4
проверка: 3
проверка: 2

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

public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);
    int testcases = sc.nextInt();
    int count =0;
    while (count<testcases){
        int numberOfColleagues = sc.nextInt();
        sc.nextLine();
        String startPieces = sc.nextLine();

        int[] listOfcolleagues = listOfColleagues(numberOfColleagues, startPieces);

        int count2 = operationsNeeded(listOfcolleagues, 1);
        count++;
        System.out.println(count2);
    }

}

 public static int operationsNeeded (int[] listOfColleagues, int count1){
    //remove duplicates first
    ArrayList<Integer> relevantList=removeDuplicatesAndSort(listOfColleagues);
    System.out.println("relevantlist" + relevantList);
    //check for smallestdelta & index
    int [] deltaAndIndex = smallestDeltaHigherIndex(relevantList);
    int delta = deltaAndIndex[0];
    int index = deltaAndIndex[1];

    if (delta==1){
        for (int i=0;i<relevantList.size();i++){
            if (i!=index){
                relevantList.set(i,relevantList.get(i)+1);
            }

        }
    }
    if (delta>1 && delta<5){
        for (int i=0;i<relevantList.size();i++){
            if (i!=index){
                relevantList.set(i,relevantList.get(i)+2);
            }
        }
    }
    if (delta>4){
        for (int i=0;i<relevantList.size();i++){
            if (i!=index){
                relevantList.set(i,relevantList.get(i)+5);
            }
        }
    }

    System.out.println(count1);
    int[] updatedList = new int[relevantList.size()];
    for (int i=0; i<relevantList.size();i++){
        updatedList[i]=relevantList.get(i);
    }
    if (!isAllTheSame(relevantList)) {
        count1 +=1;
        operationsNeeded(updatedList,count1);
    }

        System.out.println("check: " + count1);

 return count1;
}

1 Ответ

0 голосов
/ 25 февраля 2019

Ваш метод рекурсивный.Строка "check: " печатается на каждом уровне этой рекурсии со значением, которое она имеет в данный момент на этом уровне.Сначала он печатает «самое внутреннее» значение (4), чем значение уровня выше (также 4), и, наконец, значение hte на верхнем уровне, которое равно 2 после увеличения на if выше.И значение returns всегда является значением от верхнего уровня.

Если вы хотите напечатать его только один раз, вы можете напечатать его только на самом внутреннем уровне, используя else.Однако это все равно будет return значением из итерации верхнего уровня;вместо этого следите за значением, возвращаемым рекурсивным вызовом, и обновляйте count1 соответственно.

if (! isAllTheSame(relevantList)) {
    // we have to go deeper!
    count1 = operationsNeeded(updatedList, count1 + 1);
} else {
    // phew, finally done
    System.out.println("check: " + count1);
}
...