рд▓реЗрдЦ рдкрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдУ (рд▓реЙрдЧ рдПрди) рдХреЗ рд╕реНрдкрд░реНрд╢реЛрдиреНрдореБрдЦреА рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЗрд╕рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рд╕рдордп рдирд╣реАрдВ рд▓рдЧрд╛ред рдиреАрдЪреЗ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдФрд░ C ++ рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред
рдмрд╕ рдпрд╣ рд╕реВрддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:

рдЬрд╣рд╛рдБ

рд╕реВрддреНрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░реЗрд░рдг рджреНрд╡рд╛рд░рд╛ рд╕рд┐рджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм m = 0, рд╕реВрддреНрд░ рд╕рддреНрдп рд╣реИ:

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╕реВрддреНрд░ m = p рдХреЗ рд▓рд┐рдП рд╕рддреНрдп рд╣реИ

рдЖрдЗрдП рд╣рдо рд╕рд┐рджреНрдз рдХрд░реЗрдВ рдХрд┐ рд╕реВрддреНрд░ m = p + 1 рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рд╣реИ:

- рдХреЗрд╕ рдПрдо = рдкреА рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХреА, рдЕрд░реНрдерд╛рддреНред m = p + 1 рдХреЗ рд▓рд┐рдП, рд╕реВрддреНрд░ рд╕рддреНрдп рд░рд╣рддрд╛ рд╣реИ
рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ

рдПрдХ рд╣реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ:
\cdot F_{n-m} + F_{m+1}\cdot F_{n-m-1})
рд╡рд┐рд╖рдо рдПрди рдХреЗ рд▓рд┐рдП, рдореА, рд╣рдо рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╕рдорд╛рдирддрд╛рдПрдВ

рдФрд░

ред рдпрд╣ рд╕рдВрдЦреНрдпрд╛ рдмрд░рд╛рдмрд░ рд╣реИ

рд╕рд░рд▓реАрдХрд░рдг рдХреЗ рдмрд╛рдж, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реВрддреНрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:



рдирд╡реАрдирддрдо рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдПрдХ рд╕рд░рд▓ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
#include <iostream> using namespace std; void fibonachi_recursive(int n, int& fn, int& fn1) { int gn, gn1; if (n < 2) { fn = n; fn1 = 1; return; } fibonachi_recursive(n / 2, gn, gn1); if (n % 2) { fn = gn1 * gn1 + gn * gn; fn1 = gn1 * gn1 + 2 * gn * gn1; } else { fn = 2 * gn * gn1 - gn * gn; fn1 = gn1 * gn1 + gn * gn; } } int fibonachi(int n) { int fn, fn1; fibonachi_recursive(n, fn, fn1); return fn; } int main() { for (int i = 0; i < 20; i++) cout << fibonachi(i) << " "; return 0; }
рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реЗ рджреВрд░ рд╣реЛрдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ:
#include <iostream> using namespace std; unsigned fibonachi(unsigned n) { if (n < 2) return n; unsigned mask = 1, m = n; while (m > 1) { m >>= 1; mask <<= 1; } unsigned fn = 1, fn1 = 1, gn, gn1; while (mask > 1) { mask >>= 1; gn = fn; gn1 = fn1; if (n & mask) { fn = gn1 * gn1 + gn * gn; fn1 = gn1 * gn1 + 2 * gn * gn1; } else { fn = 2 * gn * gn1 - gn * gn; fn1 = gn1 * gn1 + gn * gn; } } return fn; } int main() { for (int i = 0; i < 20; i++) cout << fibonachi(i) << " "; return 0; }
UPD рдиреЗ "рд▓рдВрдмреЗ" рдЕрдВрдХрдЧрдгрд┐рдд рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП
рдПрд╕рд┐рдореНрдкреЛрдЯрд┐рдХреНрд╕ рдХрд╛ рдПрдХ рдЕрдиреБрдорд╛рди
рдЬреЛрдбрд╝рд╛