Wpis z mikrobloga

@unvector: nie umiem odpowiedzieć Ci na pytanie.
Za to wiem, że życiowo najlepszym rozwiązaniem (tam, gdzie od czasu robienia obliczeń zależy kasa / życie itp) to wiedzą matematyczną z zakresu matematyki dyskretnej/konkretnej taki ciąg rekurencyjny powinien być zmieniony w ciąg w postaci jawnej.
Tutaj poprosili wprost o postać rekurencyjną, bo ćwiczenie dotyczy innej umiejętności :-)
@unvector: ja też bym rozwiązał to zadanie (pewnie też siedząc długo). Chodzi o to, że w "życiowych" zastosowaniach przy tego typu problemie nie można sobie pozwolić na tak dramatyczny wzrost czasu obliczeń :)
@unvector: z ciekawości spróbowałem i wyglądało to tak, że najpierw spróbowałem naiwnej rekursywnej wersji, dla które oczywiście przekroczony został limit stosu. No to zrobiłem własny stos, ale tutaj został przekroczany limit czasu dla testowych danych. Kolejnym krokiem było zastosowanie programowania dynamicznego i po jego wdrożeniu testy już bez problemu przechodziły - na dojście do tego etapu zeszła mi mniej więcej godzina. Niestety dla 'attempt' przekraczało timeout, więc chcąc nie chcąc musiałem
result = F(1, 0, n)
return F(1, 0, n)

Co ja #!$%@?łem w refaktoryzacji xd. Zrobiłem teraz z tego jedną funkcję, zoptymalizowałem krok dla nieparzystych (można od razu podzielić przez 2 i uniknąć ifa + przypisania) i nareszczie przechodzi :)
@kafapre ja to rozwiązałem w Javie, algorytm ostatecznie jest bardzo prosty. Wyszedłem od zdefiniowania kilku twierdzeń i przekształceń funkcji F. Czy to co napisałeś działa i przechodzi testy w odpowiednim czasie?
@kafapre wersja dla zwykłych liczb całkowitych (int):

int fusc(int n) {
----int a = 1, b = 0;
----while (n > 0) {
--------if ((n & 1) == 0) {
------------a += b;
--------} else {
------------b += a;
--------}
--------n >>= 1;
----}
----return b;
}

w sumie wyglądają podobnie