Infiniti_Inter

Основы программирования на языке с++. Часть 3

Dec 19th, 2018
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 29.44 KB | None | 0 0
  1. Hello, SSU!
  2.  
  3. [По русскому - "3", ни слова, про логистику, грамматику, порядок изложения, пунктуацию и т.д.]
  4.  
  5. Тут можно узнать немного полезной информации, если ты только начал(-a) кодить.
  6.  
  7. Оглавление
  8. 1)Изменение цвета консоли.
  9. 2) Макросы
  10.     2.1 Макросы без параметров
  11.     2.2 Макросы с параметрами
  12.     2.3 Стоит ли использовать макросы
  13. 3) Функции
  14.     3.1) Функции возвращающие значение
  15.     3.2) Функции не возвращающие значение
  16.     3.3) Передача массива в функцию
  17.     3.4) HIDE
  18. 4) Область видимости переменной. Глобальные переменные. Константы
  19. 5) Рекурсия. Рекурсивные функции
  20. 6) HIDE
  21. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  22. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  23.  
  24. #1 - Изменение цвета консоли.
  25.  
  26. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  27. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  28. Итак, первый лайфхак(нет) связан с цветом консольного окна.
  29.    
  30. Чтобы изменить цвет шрифта и/или консольного окна нужно
  31.     - создать константу int с любым именем и задать ей значение = system("color XY"), где
  32.         X - Номер цвета для фона консольного окна
  33.         Y - Номер цвета для текста в консольном окне
  34.         номера заданы в 16-й системе счисления :
  35.                 Black         = 0,(Черный)
  36.                 Blue          = 1,(Голубой)
  37.                 Green         = 2,(Зеленый)
  38.                 Cyan          = 3,(Бирюзовый)
  39.                 Red           = 4,(Красный)
  40.                 Magenta       = 5,(Пурпурный)
  41.                 Brown         = 6,(Коричневый; бурый)
  42.                 LightGray     = 7,(Светло серый)
  43.                 DarkGray      = 8,(Темно серый)
  44.                 LightBlue     = 9,(Светло Голубой)
  45.                 LightGreen    = a,(Светло Зеленый)
  46.                 LightCyan     = b,(Светло Бирюзовый)
  47.                 LightRed      = c,(Светло Красный)
  48.                 LightMagenta  = d,(Светло Пурпурный)
  49.                 Yellow        = e,(Желтый)
  50.                 Bright White  = f,(Ярко - Белый)
  51. |--------------------------|
  52. |    пример программы      |
  53. |--------------------------|
  54.     #include<iostream>
  55.     using namespace std;
  56.     const int ANY_NAME = system("color 80");
  57.     int main()
  58.     {
  59.        cout << "Hello, SSU !!!";
  60.     }
  61. |--------------------------|
  62. |      Конец примера       |
  63. |--------------------------|
  64. /*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/
  65.  
  66. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  67. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  68.  
  69. #2 - Макросы( "дефайн"-ы )
  70.  
  71. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  72. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  73.  
  74. Макросы  - это функция, созданная с помощью директивы #difine
  75. После директивы #define указывается имя макроса, за которым в скобках (без пробелов) параметры, если таковые нужны,
  76. отделенные запятыми и определение макроса(в дальнейшем - Тело), отделенное пробелом.
  77.  
  78. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  79. # 2.2 - Макросы без параметров(Англ. "function-like macro")
  80. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  81.  
  82. Общий вид(условно): #define Имя Тело
  83. Простыми словами, если есть
  84.     #defind X Y
  85.     ,то все встреченные в программе
  86.     X заменяются на Y
  87. |------------------------------|
  88. |Примеры макросов без параметра|
  89. |------------------------------|
  90. ...
  91. #define fs first
  92. #defind sc second
  93. #define ret return
  94. #define sz size()
  95. #define len length()
  96. ...
  97. |------------------------------|
  98. |        Конец примеров        |
  99. |------------------------------|
  100.  
  101. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  102. #2.2 - Макросы с параметрами (Англ. " object-like macro ")
  103. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  104.  
  105. Общий вид(условно):
  106.     #define имя(аргументы через запятую) тело
  107.     -ВСЕ параметры, которые вы используете теле нужно указывать в скобках,
  108.          т.к. в некоторых случаях, это может привести к появлению багов
  109.     -Советую использовать приведение типов
  110.         type(<variable_name>) перед переменными в теле, где type - тип, который вы предполагаете для параметра
  111.  
  112. |------------------------------|
  113. |Примеры макросов c параметрами|
  114. |------------------------------|
  115. #include<iostream>
  116. #include<algorithm>
  117.  
  118. using namespace std;
  119.  
  120. #define forn(i, n) for(int i = 0; i < int(n); i++)
  121. // макрос на цикл от 0 до n с шагом в 1
  122.  
  123. #define forab(i, a, b) for (int i = int(a); i <= int(b); i++)
  124. // макрос на цикл с a до b с шагом в 1
  125.  
  126. #define sqr(x) (int(x) * int(x))
  127. // макрос для нахождения квадрата целого числа
  128.  
  129. #define all(a) (a).begin(), (a).end()
  130. // заменяет выражение (a).begin(), (a).end()
  131. int main()
  132. {
  133.     forn(k, 10)
  134.         cout << sqr(k) << endl;
  135.     string s = "abs";
  136.     reverse(all(s));
  137.     cout << s;
  138. }
  139.  
  140. |------------------------------|
  141. |        Конец примеров        |
  142. |------------------------------|
  143.  
  144.  
  145. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  146. #2.3 -  Стоит ли использовать макросы
  147. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  148.  
  149. //////////////
  150. Кратко - Да.
  151. //////////////
  152.  
  153.  
  154. //////////////
  155. Сжато:
  156. Многие считают макросы вредными для программы, на это есть множество обоснованных причин.
  157.     1)Макросы нельзя отлаживать
  158.         (в режиме отладки вы не зайдете в директиву define, что лишает вас возможности проверить правильность работы макроса)
  159.     2)При разворачивании макроса могут появиться странные побочные эффекты
  160.     3)Макросы не имеют пространства имен
  161.     4)Макросы могут делать что-то, о чем вы не подозреваете
  162. Но все эти "минусы" можно исправить(смотри подробную версию), а плюсы которые дают нам макросы очевидны :
  163. - Упрощенное чтение/понимание кода
  164. - Меньшее количество ляпов:
  165.     когда вы, например, пишите for (int i = n; i > 0; i++) и у вас получается бесконечный цикл
  166. - Скорость :
  167.     написать forn(i,n) куда быстрее, чем for (int i = n; i > 0; i++)
  168. //////////////
  169.  
  170.  
  171. //////////////
  172. Подробно: читай статью ---> https://habr.com/post/246971/
  173.  
  174. //////////////
  175.  
  176. /*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/
  177.  
  178.  
  179. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  180. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  181.  
  182. #3 - Функции.
  183.  
  184. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  185. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  186.  
  187. Функция - это такая конструкция, которая позволяет вынести повторяющийся участок кода за main()
  188.  
  189. Общий вид функции:
  190.  
  191. Тип_возвращаемого_значения имя_функции(аргументы)
  192. {
  193.     программный код(Тело функции)
  194. }
  195.  
  196. аргументы нужно указывать через запятую, каждый раз указывая тип переменной.
  197. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  198. #3.1 - Функции возвращающие значение
  199. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  200.  
  201.     Разберем конкретный пример
  202. -------------------------------------------------------------
  203.     #include<iostream>   
  204.  
  205.     using namespace std;
  206.    
  207.     int sum(int a, int b)// объявляем функцию sum, которая возвращает значение типа int, принимая 2 аргумента типа int
  208.     {                    
  209.         return a + b;    // возвращаем значение
  210.     }
  211.    
  212.     int main()          //Объявляем функцию main, которая не принимает аргументы.
  213.     {
  214.         int first, second;
  215.         cin >> first >> second;
  216.         int result = sum(first, second);
  217.         // объявляем новую переменную результата, которой присвоим значение функции.
  218.         cout << result << endl;
  219.         if (result == sum(first, second)) // функцию можно вызывать в условных операторах
  220.             cout << sum (first, second);
  221.             // значение функции можно выводить
  222.         int pause;cin >> pause;
  223.         return 0;                      
  224.         // возвращаем значение "0" для функции main()
  225.     }
  226. -----------------------------------------------------------
  227.     В данном примере мы имеем 2 функции возвращающие значение:
  228.         1) "sum" с аргументами (int, int)
  229.         2) "main" без аргументов.
  230.     Заметим, что аргументы функции sum отличаются от тех, которые мы передаем ей в main_e :"sum(first, second)"
  231.     Переменные, которые мы передаем в функцию называются "фактическими", а те, что мы используем в функции - "формальными".
  232.     Очевидно, что функция может не принимать значение. Проанализируйте след. Пример.
  233. ----------------------------------------------------------
  234.     #include<iostream>
  235.     using namespace std;
  236.  
  237.     int sum(int x, int y)
  238.     {
  239.         return x + y;
  240.     }
  241.  
  242.     int ReadInt()
  243.     {
  244.         int n;
  245.         cin >> n;
  246.         return n;
  247.     }
  248.  
  249.     int main()
  250.     {
  251.         cout << sum(ReadInt(), ReadInt());
  252.         int pause; cin >> pause;
  253.         return 0;
  254.     }
  255.  
  256. -------------------------------------------------------------
  257. Ф-я ReadInt()  не принимает значения, она вызывается в вызове ф-и sum(int, int)
  258.    
  259. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  260. # 3.2  - Функции не возвращающие значение
  261. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  262.  
  263. Функция, которая не возвращает никакого значение, имеет вид:
  264.  
  265. void Имя_функции(аргументы)
  266. {
  267.     программный код(Тело функции)
  268. }
  269.  
  270. Рассмотрим примеры нескольких функций типа void
  271. -------------------------------------------------------------
  272. #include<iostream>
  273. using namespace std;
  274.  
  275. void DeBug()// Функция предназначена для отладки программы.
  276. {
  277.     cout << "I was here\n";
  278. }
  279. void SWAP(int &a, int &b)
  280. /*         
  281.                         !!!!!!!!!!ВАЖНЫЙ МОМЕНТ!!!!!!!!!!
  282. 'a' и 'b' передаются по ссылке, изменив значение этих формальных переменных в
  283. функции SWAP, изменятся и фактические аргументы, от которых была вызвана функция.
  284. */
  285. {
  286.     int temp = a;
  287.     a = b;
  288.     b = temp;
  289.     DeBug();//если программа дойдет до этого места, то она выведет сообщение об этом.
  290. }
  291. void my_print(const int &x, const int &y)
  292. /*
  293.  Так же можно фиксировать значение переменной. В этом случае значение
  294.  'x' и 'y' изменить невозможно(в данной функции)
  295. */
  296. {
  297.     cout << x << ' ' << y << endl;
  298. }
  299.  
  300. int main() // Да, можно писать void main(), но делать этого не стоит.
  301. {
  302.     int x, y;
  303.     cin >> x >> y;
  304.     SWAP(x, y);     // меняем местами 2 переменные
  305.     my_print(x, y); // выводим их значение
  306.     int pause;cin >> pause;
  307.     return 0;
  308. }
  309. -------------------------------------------------------------
  310. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  311. # 3.3  - Передача массива в функцию
  312. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  313. Массив - это указатель, поэтому если изменить формальную переменную, то изменится и фактическая.
  314. -------------------------------------------------------------
  315. #include<iostream>
  316. using namespace std;
  317.  
  318. void Fill(int* a, int n)// массив - это указатель на тип,
  319. {
  320.     for (int i = 0; i < n; ++i)
  321.         cin >> a[i];
  322. }
  323. void Print(int a[], int n)// еще 1 способ передачи массива в функцию
  324. {
  325.     for (int i = 0; i < n; ++i)
  326.         cout << a[i] << ' ';
  327. }
  328. int main()
  329. {
  330.     int * a = new int[5];
  331.     Fill(a, 5);
  332.     Print(a, 5);
  333.     return 0;
  334. }
  335. -------------------------------------------------------------
  336. ДИНАМИЧЕСКИЙ МАССИВ
  337. -------------------------------------------------------------
  338. #include<iostream>
  339. using namespace std;
  340.  
  341. void create(int* a, int n)
  342. /* Чтобы программа заработала, нужно заменить
  343. void create(int* a, int n) ---> void create(int* &a, int n)
  344. */
  345. {
  346.     a = new int[n];
  347.     for (int i = 0; i < n;++i)
  348.         a[i] = rand() % 10;
  349. /*rand() - генератор чисел. берем по модулю, чтобы числа не превышали "9" */
  350.     cout << "I create : \n";
  351.     for (int i = 0; i < n; ++i)
  352.        cout << a[i] << ' ';
  353.     cout << "\n";
  354. }
  355. void Print(int* a, int n)
  356. {
  357.     cout << "But found :\n";
  358.     for (int i = 0; i < n; ++i)
  359.         cout << a[i] << ' ';
  360. }
  361. int main()
  362. {
  363.     int* a;
  364.     int n;
  365.     cin >> n;
  366.     create(a, n);
  367.     Print(a, n);
  368. }
  369. -------------------------------------------------------------
  370.  
  371. /*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/
  372.  
  373. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  374. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  375.  
  376. #4 - Область видимости переменной. Глобальные переменные. Константы
  377.  
  378. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  379. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  380.  
  381. Область видимости переменной - это область на которой она определена, существует и к ней можно обратиться.
  382.  На начальном этапе можно представить, что переменная действительна только с момента ее объявления до конца
  383.  {}, в которых она была объявлена.
  384. -------------------------------------------------------------
  385. #include<iostream>
  386. using namespace std;
  387. int main()
  388. {
  389. ...
  390.     int i = 0;//область видимости - функция main, начиная с этой строки.
  391.     while(i < 10)
  392.     {//  (1)
  393.         int c // область видимости - от (1) до (2)
  394.         c = i * i;
  395.         cout << c << "\n";
  396.         i++;
  397.     }// (2)
  398. ...
  399. }
  400. -------------------------------------------------------------
  401. Заметим, что грамотная расстановка фигурных скобочек упрощает чтение кода. Например, намного
  402. проще определить область видимости той или иной переменной.
  403.  
  404. /*
  405. Хороший программист, по-моему мнению, должен минимизировать область видимости всех переменных.
  406. */
  407.  
  408. Заметим, что в цикле for ()нет никаких {}, однако переменные ,объявленные в нем, определены лишь до конца цикла.
  409. -------------------------------------------------------------
  410. #include<iostream>
  411. using namespace std;
  412. int main()
  413. {
  414.     for(int i = 0, k = 1; i < 10; ++i, k ^= 1)
  415.     // k ^= 1 <=> k = k ^ 1 - исключающее или.
  416.         {
  417.             cout << i << '\t' << k << '\n';
  418.         }
  419.     // в этом месте переменные i & k не определены.
  420. }
  421. -------------------------------------------------------------
  422. Ещё одно очень важное понятие - глобальная переменная.
  423. Это такая переменная, которая имеет максимально возможную область видимости - вся программа.
  424. Из-за особенностей хранения глобальных переменных они изначально инициализированы и равны "0", что даёт ряд преимуществ.
  425. Р/м примеры использования глобальных переменных
  426. -------------------------------------------------------------
  427. Задача: дан набор из n чисел, найти самое часто встречающиеся
  428. число. Если ответов несколько - вывести любой из них.
  429. -------------------------------------------------------------
  430. #include<iostream>
  431.  
  432. using namespace std;
  433.  
  434. int cnt[100];
  435.  
  436. int main()
  437. {
  438.     int n;
  439.     cin >> n;
  440.     int answer = 0;
  441.     for (int i = 0; i < n; ++i)
  442.     {
  443.         int cur;
  444.         cin >> cur;
  445.         cnt[cur]++;
  446.         if (cnt[cur] > cnt[answer])
  447.             answer = cur;
  448.     }
  449.     cout << answer;
  450.  
  451. }
  452. -------------------------------------------------------------
  453. Задача: написать функцию чтения и вывода массива.
  454. Как я и говорил, нужно минимизировать область видимости, но
  455. знать такую особенность вы должны.
  456. -------------------------------------------------------------
  457. #include<iostream>
  458. using namespace std;
  459.  
  460. int n;
  461. int* a;
  462.  
  463. void READ()
  464. {
  465.     for (int i = 0; i < n; ++i)
  466.         cin >> a[i];
  467. }
  468. void PRINT()
  469. {
  470.     for (int i = 0; i < n; ++i)
  471.         cout << a[i] << ' ';
  472. }
  473. int main()
  474. {
  475.     cin >> n;
  476.     a = new int[n];
  477.     READ();
  478.     PPRINT();
  479. }
  480. -------------------------------------------------------------
  481. Константы - это переменные с фиксированным значением. Обычно константам дают имя, содержащее исключительно заглавные буквы, цифры и знаки подчеркивания, чтобы в дальнейшем понимать, что используемая переменная неизменна.
  482. -------------------------------------------------------------
  483. ...
  484. #include<math.h>
  485. ...
  486. const double PI = acos(-1.0);
  487. const double TAU = 2 * PI;
  488. const int MOD = 1e8;//используется приведение типа, 1e8 -> int(10^8)
  489. ...
  490. Так же можно передавать переменные в функцию с припиской
  491. "const", что не даёт программисту права менять ее в процессе. Это особенно важно при передачи параметров по ссылке
  492. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  493.  
  494. /*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/
  495.  
  496. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  497. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  498.  
  499. #5 - Рекурсия. Рекурсивные функции
  500.  
  501. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  502. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  503.  
  504. Рекурсия - это вызов программы(функции) самой себя
  505. У рекурсии обязательно должно быть условие выхода из нее, иначе возникнет ошибка переполнения стека.
  506.  
  507. Пример /*плохой*/ рекурсии
  508. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  509.  
  510. void bad()
  511. {
  512.     bad();
  513. }
  514. int main()
  515. {
  516.     bad();
  517. }
  518. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  519. Рассмотрим примеры рабочих рекурсий
  520. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  521. #include<iostream>
  522. using namespace std;
  523.  
  524. void Hello_World_N(int n)
  525. {
  526.     if (n <= 0) return;//условие выхода из функции
  527.     Hello_World_N(n - 1);
  528.      cout << n << "  -  Hello, world!\n";
  529. }
  530. int ToZero(int c)
  531. {
  532.     if (c <= 0)
  533.         return 0;
  534.     cout << c << endl;
  535.     return ToZero(c - 1);
  536. }
  537.  
  538. int main()
  539. {
  540.     Hello_World_N(3);
  541.     ToZero(3);
  542. }
  543. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  544. /*
  545. вывод программы:
  546. --------------------
  547. 1  -  Hello, world!
  548. 2  -  Hello, world!
  549. 3  -  Hello, world!
  550. 3
  551. 2
  552. 1
  553. --------------------
  554. Заметим, что в первом случае прямой порядок, а во втором - обратный.
  555. Рекурсия сначала доходит до самого ее последнего вызова(т.е. условия выхода) и возвращается к первому через стек.
  556. Если вам не понятен этот момент, то запустите эту программу в режиме отладки с точками останова внутри функций.
  557.  
  558. */
  559. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  560. Примеры полезных рекурсивных функций
  561. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  562.  
  563. #include<iostream>
  564. using namespace std;
  565.  
  566. int my_gcd(int a, int b)// поиск НОД
  567. {
  568.     if (a == 0)
  569.         return b;
  570.     else
  571.         return my_gcd(b % a, a);
  572. }
  573.  
  574.  int fib(int n)//N-е число Фибоначчи
  575.  {
  576.      if (n == 1 || n == 2)
  577.          return 1;
  578.      if (n == 0)
  579.          return 0;
  580.     return fib(n - 1) + fib(n - 2);
  581.  }
  582.  
  583.  double pow(double base, int exp)//возведение в степень(epx >= 0)
  584.  {
  585.      if (exp == 0)return 1;
  586.      if (exp == 1)return base;
  587.      return base * pow(base, exp - 1);
  588.  }
  589.  
  590.  int fact(int n)//факториал числа N
  591.  {
  592.      if (n == 0) return 0;
  593.      if (n == 1) return 1;
  594.      return n * fact(n - 1);
  595.  }
  596.  
  597. int main()
  598. {
  599.     cout << "gcd : " << my_gcd(60, 12) << endl;
  600.     cout << fib(6) << endl;
  601.     cout << pow(2, 4) << endl;
  602.     cout << fact(5);
  603. }
  604.  
  605. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  606. pow(double, int)
  607. Если степень = 0, то функция должна вернуть 1, по определению.
  608. Если степень = 1, то нужно вернуть само число,
  609. Ну и во всех остальных случаях - умножить основание на функцию от этого же основания, но в степени на единицу меньше.
  610.  
  611. 2 ^ 4 =
  612. pow(2, 4) = 2 * pow(2, 3)
  613. pow(2, 3) = 2 * pow(2, 2)
  614. pow(2, 2) = 2 * pow(2, 1)
  615. pow(2, 1) = 2;
  616.  
  617.  2,4
  618.   |  * 2
  619.  2,3
  620.   |  * 2
  621.  2,2
  622.   |  * 2
  623.  2,1 = 2
  624.  
  625. --------------------------------------------------
  626. *Взято с ru.stackoverflow.com*
  627.  
  628. Рекурсивный вызов функции fib(6) можно представить следующим образом
  629.  
  630. fib( 6 ) = fib( 5 ) + fib( 4 )  
  631. fib( 5 ) = fib( 4 ) + fib( 3 )  
  632. fib( 4 ) = fib( 3 ) + fib( 2 )  
  633. fib( 3 ) = fib( 2 ) + fib( 1 )
  634. fib( 2 ) = fib( 1 ) + fib( 0 )
  635. fib( 1 ) = 1
  636. fib( 0 ) = 0
  637. Или можно представить в виде дерева, где листья будут вызовами для функции с аргументами 0 или 1, так как эти вызовы более не вызывают функцию рекурсивно
  638.  
  639.                                        6
  640.                   ------------------------------------------
  641.                  |                                          |
  642.                  4                     +                    5
  643.         -------------------                        -------------------
  644.        |                   |                      |                   |
  645.        2         +         3                      3        +          4
  646.    ---------           ---------              ---------           ---------
  647.   |         |         |         |            |         |          |        |
  648.   0    +    1         1    +    2            1   +     2          2   +    3
  649.                               -----                  -----      -----    -----
  650.                              |     |                |     |    |     |  |     |
  651.                              0  +  1                0  +  1    0  +  1  1  +  2
  652.                                                                             -----
  653.                                                                            |     |
  654.                                                                            0  +  1
  655. /*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/
  656.  
  657.  
  658.  
  659. ....to be continued
  660. [Массивы]
  661. [Функции](will upd)
  662. [Рекурсия]+
  663. [Манипуляторы](hate)
  664. [Асимптотическое время работы программы O(?)]
  665.  
  666.  
  667.  
  668. ---------------Change Log---------------
  669. 20.12.18 - косметические фиксы
  670. 21.12.18 - add (3; 3.1; 3.2)
  671. 21.12.18 - косметические фиксы
  672. 22.12.18 - add (3.3; 4)
  673. 23.12.18 - add (5)
Add Comment
Please, Sign In to add comment