Zdefiniujmy sekwencję Fibonacciego jako
F(1) = 1
F(2) = 2
F(n) = F(n - 2) + F(n - 1)
Mamy więc nieskończoną sekwencję 1,2,3,5,8,13,
... Dobrze wiadomo, że każdą dodatnią liczbę całkowitą można zapisać jako sumę niektórych liczb Fibonacciego. Jedynym zastrzeżeniem jest to, że to podsumowanie może nie być wyjątkowe. Zawsze istnieje co najmniej jeden sposób na zapisanie liczby jako sumy liczb Fibonacciego, ale może być ich znacznie więcej.
Twoim wyzwaniem jest napisanie kompletnego programu, który za pomocą stdin przyjmuje dodatnią liczbę całkowitą od jednego do miliona włącznie, a następnie wypisuje za pomocą stdout wszystkie możliwe sumy liczb Fibonacciego, które sumują się do danych wejściowych. Podsumowując, liczby Fibonacciego nie mogą się powtarzać i obejmuje to liczbę 1
. W każdym podsumowaniu, jeśli 1
jest obecne, musi być obecne tylko raz, ponieważ w mojej definicji powyższej sekwencji 1
pojawia się tylko raz. Sumy z tylko terminem są poprawne, więc jeśli liczbą wejściową jest sama liczba Fibonacciego, to sama liczba jest poprawną sumą i musi zostać wydrukowana. W przypadku wielu sum, pomiędzy dowolnymi dwoma sumami musi znajdować się pusty wiersz, aby łatwo je rozróżnić.
Oto kilka próbek.
./myfib 1
1
Jest tylko jedna taka suma i ma ona tylko termin, więc to wszystko, co jest drukowane.
./myfib 2
2
Zauważ, że 1+1
nie jest to poprawna suma, ponieważ się 1
powtarza.
./myfib 3
1+2
3
Dwie kwoty i obie są wydrukowane z pustą linią pomiędzy nimi.
./myfib 10
2+8
2+3+5
./myfib 100
3+8+89
1+2+8+89
3+8+34+55
1+2+3+5+89
1+2+8+34+55
3+8+13+21+55
1+2+3+5+34+55
1+2+8+13+21+55
1+2+3+5+13+21+55
Prawdziwy golf. Wygrywa najkrótszy kod w dowolnym języku. Proszę zamieścić kod wraz z niektórymi przypadkami testowymi (oprócz tego, który podałem powyżej). W przypadku remisów wybieram ten z najwyższymi ocenami po odczekaniu co najmniej dwóch tygodni i prawdopodobnie dłużej. Społeczność może więc głosować za rozwiązaniami, które lubisz. Sprytność / piękno kodu ma o wiele większe znaczenie niż to, kto pierwszy.
Miłego kodowania!