вычислить сумму рекурсивно из стека - PullRequest
0 голосов
/ 09 февраля 2020

Почему нижеприведенная кодовая печать "6"? Я бы ожидал "13" в результате.

        void testSum(){
            Stack<Integer> myStack = new Stack();
            myStack.add(3);
            myStack.add(4);
            myStack.add(6);
            System.out.println(calculateSum(myStack, 0));
        }

        Integer calculateSum(Stack<Integer> myStack, int sum) {
            if (!myStack.empty()) {
                sum = sum + myStack.pop();
                calculateSum(myStack, sum);
            }
            return sum;
        }

Ответы [ 2 ]

2 голосов
/ 09 февраля 2020

То, что сказал Мангуста, верно. Вы могли бы сделать что-то вроде этого тоже:

static void testSum(){
        Stack<Integer> myStack = new Stack();
        myStack.add(3);
        myStack.add(4);
        myStack.add(6);
        System.out.println(calculateSum(myStack));
    }

static Integer calculateSum(Stack<Integer> myStack) {
    if (!myStack.empty())
        return myStack.pop() + calculateSum(myStack);
    return 0;
}
1 голос
/ 09 февраля 2020

sum передается по значению. Если вы хотите имитировать передачу по ссылке, вы можете создать класс-оболочку для целого числа, как показано ниже:

class IntWrapper
{
 int n;
}

, и соответственно изменить свой код:

static void testSum(){
    Stack<Integer> myStack = new Stack();
    myStack.add(3);
    myStack.add(4);
    myStack.add(6);
    System.out.println(calculateSum(myStack, new IntWrapper()));
}

static Integer calculateSum(Stack<Integer> myStack, IntWrapper sum) {
    if (!myStack.empty()) {
        sum.n = sum.n + myStack.pop();
        calculateSum(myStack, sum);
    }
    return sum.n;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...