Я изучаю следующий код, который призван выяснить решения х и у в расширенном Евклида алгоритм:Не могу понять, как «возвращение» работает
long gcd(long a, long b, long &x, long &y) {
long d; // place to hold final gcd
// in case b = 0, we have d=|a|, x=1 or -1, y arbitrary (say, 0)
if (b==0) {
if (a<0) {
d = -a;
x = -1;
y = 0;
} else {
d = a;
x = 1;
y = 0;
}
return d;
}
// if b is negative, here is a workaround
if (b<0) {
d = gcd(a,-b,x,y);
y = -y;
return d;
}
// if a is negative, here is a workaround
if (a<0) {
d = gcd(-a,b,x,y);
x = -x;
return d;
}
// set up recursion
long aa = b;
long bb = a%b;
long qq = a/b;
long xx,yy;
d = gcd(aa,bb,xx,yy);
x = yy +1;
y = xx - qq*yy;
return d;
}
То, что я действительно не понимаю как работает «return d». Учитывая два ввода номера (a, b), я пытаюсь следовать всем поведением, рассматривающим сеанс отладки (используя Apple Xcode).
Когда б == 0, то здесь идет:
if (b==0) {
if (a<0) {
d = -a;
x = -1;
y = 0;
} else {
d = a;
x = 1;
y = 0;
}
return d;
}
и от этого «возвращения д» он подскакивает до последнего «возвращения г» в конце кода. Оказавшись там, он начинает цикл этот последний кусок кода:
d = gcd(aa,bb,xx,yy);
x = yy +1;
y = xx - qq*yy;
return d;
}
пока все решения не будут найдены.
Мой вопрос являются:
1) почему с первого «возвращения д» он скачет прямо до последнего «возвращения д»? 2) как может быть возможно, что оттуда он остается в последние четыре строки до конца, вместо того, чтобы вызвать функцию
d = gcd(aa,bb,xx,yy);
как это было сделано раньше?
Здесь я выкладываю также основное:
int main() {
long a,b,x,y;
cout << "Insert first ---> ";
cin >> a;
cout << "Insert second ---> ";
cin >> b;
cout << "The gcd of " << a << " and " << b << " is "
<< gcd(a,b,x,y)<<endl;
cout << "x is " << x << " and y is " << y << endl;
return 0;
}
спасибо
'return d' не прыгает нигде, кроме функции, из которой была вызвана функция. Это стандартная инструкция, которая немедленно завершает выполнение функции, уничтожает все местные жители в последнем порядке и передает предоставленное значение вызываемому абоненту. – bipll