Почему & ldquo; int mid = (слева - справа) / 2 + справа & rdquo; вызовет переполнение стека?

Вы должны ссылаться на полное ограничение PK, вы не можете просто ссылаться на один столбец, даже если вы делаете это для двух столбцов отдельно.

Вам нужно создать одиночный Ограничение FK, ссылающееся на на оба столбца :

CREATE TABLE Metal (
    Mstuff VARCHAR(40) NOT NULL,
    SubthingID INTEGER NOT NULL,
    consists_of INTEGER NOT NULL,
    foreign key (SubthingID, consists_of) 
       references subthing (SubthingID, consists_of) --<< ONE constraint with TWO columns
    PRIMARY KEY (SubthingID, consists_of)
);
-5
задан Meilan 15 January 2019 в 22:42
поделиться

1 ответ

Когда вы запустите это, рано или поздно, вероятно, что left будет на единицу меньше, чем right - например, может быть left = 3 и right = 4.

В этом случае (left - right) / 2 и (right - left) / 2 оба оцениваются как 0, поскольку целочисленное деление округляется до нуля. Итак, если у вас есть

int mid = (left - right)/2 + right;
sort(array, helper, left, mid);

в вашем вызове на sort(array, helper, left, right), то вы повторяете вызов с точно такими же значениями. Это вызывает бесконечную рекурсию - StackOverflowError.

Но когда у вас есть

int mid = left + (right - left)/2;
sort(array, helper, left, mid); 

, вы повторяете вызов с другими значениями, поэтому рекурсия имеет шанс завершиться.

0
ответ дан Dawood ibn Kareem 15 January 2019 в 22:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: