Я думаю, что вы смотрите на это неправильно. Если вы вызываете два метода. например.
public int test() {
int x = getSomeInt(1);
int y = getSomeInt(2);
return x + y;
}
Вы когда-нибудь задавались вопросом, выполнено ли return x + y
или значение x
определено ранее y
? Он делает это сверху вниз, и инструкция оператора y
не запускается до того, как возвращается getSomeInt(1)
, а ее значение устанавливается как x
.
Итак, к вашему примеру:
protected int getArea() {
if (width <= 0) {
return 0;
} elseif (width == 1) {
return 1;
} else {
Triangle t2 = new Triangle(width - 1);
int area = t2.getArea();
return area + width;
}
}
Итак, если у вас есть Треугольник с шириной 1
и вызовом getArea
, вы получите 1
обратно.
Что произойдет, если вы сделаете это на треугольнике с шириной 2
? Он создает t2
с шириной 1
и вызывает getArea
. Мы уже знаем результат, так как рассчитали его уже. area
становится 1
и затем возвращается 1 + 2
.
Что произойдет, если вы сделаете это с шириной 3 ?. Это создаст t2
с шириной 2
и вызовет getArea()
на этом. Мы знаем, что возвращается 3
из вышеприведенного и в результате 3 + 3
.
Реквизивный метод вызывается с большим значением with
, но сначала определяется метод с 1
, затем 2, 3, 4, ... и, наконец, вызов, который вы на самом деле вызвали, имеет area
что он добавляет with
к.
Каждый вызов метоида не имеет отношения к вызываемому абоненту . Это тот же код, да, но это другой объект, и локальные переменные уникальны для вызова так же, как два вызова getSomeInt
также имеют две разные версии того, что он назвал своим первым параметром. Они не запутаны, если вы не мутируете или не передаете по ссылке.
Вызов метода для объекта очень похож на объект, являющийся аргументом в вызове. У рекурсивного вызова есть объект с меньшим значением width
, и в какой-то момент он попадет в базовый вариант. Вы могли бы сказать, что это то же самое:
public static int getArea(Triangle t) {
if (t.width <= 0) {
return 0;
} elseif (t.width == 1) {
return 1;
} else {
Triangle t2 = new Triangle(t.width - 1);
int area = getArea(t2);
return area + t.width;
}
}
Опять же ... метод рекурсивности ничего не меняет. Это не специальное лечение. Ему нужно завершить свои вызовы, прежде чем он сможет вернуть значение, как если бы вы использовали другой метод для получения области в getArea
.. Никакой разницы нет.