Prosta rekurencja - mały problem [C] [NWD]

0

Mianowicie mam program, który wyznacza największy wspólny dzielnik liczb naturalnych m i n (algorytm Euklidesa) napisany za pomocą rekurencji.

Oto on:

# include <stdio.h>
# include <conio.h>
 
int algorytm(int m,int n)
{
if (n==0) return(m);
else return(algorytm(n,m%n));
}
 
main()
{
int m,n;
printf("m:");
scanf("%d",&m);
printf("n:");
scanf("%d",&n);
printf("NWD wynosi: %d", algorytm(m,n));
getch();
}

Mam teraz pytanie... kto wytłumaczy mi co tu odpowiada za zmianę kolejności podania argumentów.

Np. podaje m: 15
n: 5

Wynik wynosi: 5

okej...

teraz podaje to samo czyli odwrotnie:

n:5
m:15

Wynik wynosi też: 5

Cała zagadka kryje się tutaj:

if (n==0) return(m);
else return(algorytm(n,m%n));
}

lub tutaj:

 printf("NWD wynosi: %d", algorytm(m,n));

Jak to zmodyfikować, żeby w kodzie było dobrze widać tą zamianę?
Albo może ktoś mi napisze co w powyższym kodzie odpowiada za te zamiane?

0

Za zmianę odpowiada... odwrotne podanie argumentów przy wywołaniu rekurencyjnym, przyjrzyj się zmianie pozycji n na liście argumentów funkcji i przy rekurencji. Nie może być "dobrze widać" bo dla tego algorytmu kolejność nie ma większego znaczenia, w "gorszym" przypadku pierwsze wywołanie rekurencyjne sprowadzi "gorszy" przypadek do "lepszego".

0

Jeżeli n > m to (n, m % n) = (n, m), a więc wywołanie algortym(m, n) w returnie zwróci wynik wywołania algorytm(n, m).

0

Dzięki za szybkie odpowiedzi ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1