.
asdf: rekurencja
mam napisać algorytm potęgi a
n rekurencyjnie i opisać to drzewkiem:
kod:
if(n=0) {
return 1; }
if (n %2 = 1) {
n = (n−1)/2;
return
a * potega(a,n) * potega(a,n);
}
if (n%2 = 0) {
n = n/2;
return potega(a,n) * potega(a,n);
}
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
na przykład:
a
6:
6%2 = 0;
n = 6/2 = 3;
return potega(a,3) * potega(a,3);
teraz n = 3;
3%2 = 1;
n = 3−1/2 = 1
return
a * potega(a,1) * potega(a,1);
teraz n = 1;
1%2 = 1;
n = (1−1)/2 = 0;
return a * potega(a,0) * potega(a,0)
gdy n = 0 znam wartość =
1
i teraz zaczynam to zliczać drzewkiem:
http://postimg.org/image/rfjijj21l/
dobrze to rozumiem i czy mógłbym dać przypadek graniczny:
if(n=1)
return a;
?
Trivial:
Gratulacje! Właśnie napisałeś bardzo niewydajną funkcję podnoszenia do potęgi z ogromnym
drzewem. Zamiast liczenia dwa razy tego samego możesz zapamiętać gdzieś wartość pośrednią.
Zrób to tak:
http://ideone.com/WqPIuL
Zadanie dla Ciebie: przepisz to do C.