Я изучал некоторые базовые алгоритмы, затем наткнулся на Евклидов алгоритм, чтобы найти GCD из двух чисел.
Я понял этот алгоритм на бумаге.Существует итеративный код, который делает то же самое.
int euclid_gcd(int a, int b){
int dividend = a>=b ? a : b;
int divisor = a<=b ? a : b;
while(divisor!=0){
int remainder = dividend % divisor;
dividend = divisor;
divisor = remainder;
}
return dividend;
}
Мне очень комфортно с приведенным выше итеративным кодом. Потом было еще две рекурсивные версии того же кода
int gcd(int a, int b){
if(a==b)
return a;
if(a>b)
return gcd(a-b,b);
return gcd(a,b-a);
}
И этонаименьший с точки зрения линий]
int gcd(int a, int b){
if (a == 0)
return b;
return gcd(b % a, a);
}
Исходя из моего понимания рекурсии, В рекурсии мы пытаемся найти ответ на сложную проблему (общий случай), используя ответ, который мы знаем (базовый случай)
По мере того, как рекурсивные вызовы складываются, мы, по сути, будем идти к более простым задачам, пока не будет достигнут базовый случай.Базовый случай возвращает значение, и из-за того, что это значение возвращается, ответы на все сложенные подзадачи начинают пузыриться до исходного вызова функции, и в конце мы получаем ответ на нашу проблему.
IЯ не понимаю, как значение, возвращаемое базовым регистром, используется вызовами функций, размещенными выше
Это моя попытка сухого запуска вышеуказанного кода (третий).Вызов функции:
gcd(20,8);
gcd (20,8) -> gcd (8,20) -> gcd (4,8) -> gcd (0,4)
сейчасмы попали в базовый случай с помощью вызова функции gcd(0,4)
Он вернул 4
Теперь, как предыдущий вызов функции gcd(4,8)
использовал это 4
Мы не «перехватываем» возвращаемое значение в какой-либо переменной. Тогда что именно происходит с этим значением и как окончательный ответ (в данном случае 4) всплывает и возвращается исходным вызовом функции?