codegod313

Recurs

Jan 19th, 2020
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.32 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <locale.h>
  4. #include <windows.h>
  5.  
  6. //--------------------------------------------------------------------------------------
  7. // Рекурсивное вычислеrние факториала числа   n!
  8. //int fact1(int);
  9. //int fact2(int);
  10. //int fact3(int);
  11. //
  12. //int main()
  13. //{
  14. //  setlocale(LC_ALL, "Russian");
  15. //  system("CLS");
  16. //  int n, i;
  17. //  char c;
  18. //  do
  19. //  {
  20. //      fflush(stdin);
  21. //      puts("\nВводите число >=0 для вычисления его факт-ла :");
  22. //      i = scanf("%d", &n);
  23. //  } while (i<1 || n<0);
  24. //  printf("\nФакториал числа %d ( %d! ) = %d   вариант 1", n, n, fact1(n));
  25. //  printf("\nФакториал числа %d ( %d! ) = %d   вариант 2", n, n, fact2(n));
  26. //  printf("\nФакториал числа %d ( %d! ) = %d   вариант 3", n, n, fact3(n));
  27. //  getch();
  28. //}
  29. //// функция вычисления факт-ла  (вариант 1 )
  30. //int fact1(int n)
  31. //{
  32. //  int i;
  33. //  if (n == 1 || n == 0) return (1);    // выход из рекурсии
  34. //  return fact1(n - 1)*n;
  35. //}
  36. //
  37. //// функция вычисления факт-ла  (вариант 2 )
  38. //int fact2(int n)
  39. //{
  40. //  static long i; // i-статическая переменная, чтобы сохранять своё последнее
  41. //                 // значение при каждом новом вызове функции
  42. //  int factorial;
  43. //  if (n <= 1)    // если число = 0 или 1
  44. //      return 1;  // факториал равен 1    
  45. //  if (++i < n)   // используем предварительное увеличение i на единицу
  46. //  {
  47. //      factorial = i*fact2(n); // заново вызываем функцию факториала
  48. //      i--;                    // декрементируем i
  49. //      return factorial;
  50. //  }
  51. //  i--;
  52. //  return n;
  53. //}
  54. //
  55. //// функция вычисления факт-ла  (вариант 3 )
  56. //int fact3(int n)
  57. //{
  58. //  return n>1 ? n*fact3(n - 1) : 1;
  59. //}
  60.  
  61. //---------------------------------------------------------------------------------------------
  62. // Рекурсивное вычислеrние чисел принадлежащих посл-сти Фибоначчи
  63.  
  64. //int fibon(int);
  65. //
  66. //int main()
  67. //{
  68. //  setlocale(LC_ALL, "Russian");
  69. //  system("CLS");
  70. //  int n, i;
  71. //  printf("\nЧисла Фибоначчи = ");
  72. //  for (n = 0; n<15; n++) printf("%4d", fibon(n));
  73. //  getch();
  74. //}
  75. //
  76. //int fibon(int n)
  77. //{
  78. //  return ((n == 0 || n == 1)) ? 1 : fibon(n - 1) + fibon(n - 2);
  79. //}
  80.  
  81. //-----------------------------------------------------------------------------------------------
  82. // Рекурсивный переворот строки на месте
  83. //
  84. //# define kk 20
  85. //void revers1(char *, int);
  86. //void revers2(char *, int);
  87. //
  88. //// определение длины строки
  89. //int str_len(char *s)
  90. //{
  91. //  static int t;
  92. //  if(s[t++]) str_len(s);
  93. //  return t;
  94. //}
  95. //
  96. //int main()
  97. //{
  98. //  setlocale(LC_ALL, "Russian");
  99. //  int nn;
  100. //  char *st;
  101. //  st = (char*)malloc(kk);
  102. //  if(!st) return 0;
  103. //  fflush(stdin);
  104. //  puts("\nВводите символьную строку : ");
  105. //  gets(st);  
  106. //  nn = str_len(st)-1;
  107. //  system("CLS");
  108. //  printf("\n nn=  %d", nn);
  109. //  printf("\nСтрока до переворота    %s", st);
  110. //  revers2(st, nn);
  111. //  printf("\nСтрока после переворота %s", st);
  112. //  revers2(st, nn);
  113. //  printf("\nСтрока после переворота %s", st);
  114. //
  115. //  getch();
  116. //}
  117. //
  118. //// рекурсивные функции реверсивного переворота строки
  119. //void revers1(char *ss, int nn)
  120. //{
  121. //  static int i;
  122. //  char c;
  123. //  c = *(ss + i++);        // сохраняем в стеке очередной считанный символ
  124. //  if (c) revers1(ss, nn); // рекурсивный вызов для считывания нового симв.
  125. //  else return;            // пока не считан конец строки, иначе выход из
  126. //                              // рекурсии
  127. //  printf("\n i=  %d", i);
  128. //  *(ss + nn - (--i)) = c; // обратный проход по функциям после окончания   
  129. //                          // рекурсии
  130. //  if (i == 1) i = 0;
  131. //}
  132. //
  133. //void revers2(char *ss, int nn)
  134. //{
  135. //  static int i;
  136. //  char c;
  137. //  c = *(ss + i);
  138. //  *(ss + i) = *(ss + nn - 1 - i);       // замена символов до тех пор пока
  139. //  *(ss + nn - 1 - i++) = c;
  140. //  if (i< (nn / 2)) revers2(ss, nn); // не достигнута середина строки
  141. //  else return;
  142. //
  143. //}
  144.  
  145. //----------------------------------------------------------------------------------
  146. // Сортировка массива чисел(методом Хоора)
  147.  
  148. #define k 9
  149. void hoor(int *, int, int);
  150. void swap(int *, int, int);
  151. void FOR(int *, int, int, int, int &);
  152.  
  153. int main()
  154. {
  155.     setlocale(LC_ALL, "Russian");
  156.     int a[k], i;
  157.  
  158.     puts("\nВводите элементы массива ");
  159.     for (i = 0; i<k; i++)
  160.     {
  161.         fflush(stdin);
  162.         if (!scanf("%d", &a[i])) i--;
  163.     }
  164.     system("CLS");
  165.     printf("\nИсходный массив        :");
  166.     for (i = 0; i<k; i++) printf("%4d", a[i]);
  167.     hoor(a, 0, k - 1);
  168.     printf("\n\nПреобразованный массив :");
  169.     for (i = 0; i<k; i++) printf("%4d", a[i]);
  170.     printf("\n");
  171. }
  172.  
  173. void hoor(int *a, int l, int r)
  174. {
  175.     int i, las;
  176.     if (l >= r)  return;
  177.     swap(a, l, (l + r) / 2); // делящий эл-т переносится в a[l] (a[l]<->a[(l+r)/2])
  178.     las = l;                 // позиция посл-го эл-та большего чем делящий
  179.     for (i = l + 1; i <= r; i++) // деление [l,r] на [l,las-1] и [las+1,r]
  180.     if (a[i]<a[l])                    
  181.         swap(a, ++las, i);
  182.     //FOR(a, l, r, 0, las);
  183.     swap(a, l, las);
  184.     hoor(a, l, las - 1);     // сортировка для [l,las-1]
  185.     hoor(a, las + 1, r);     // сортировка для [las+1,r]
  186. }
  187.  
  188. void swap(int *a, int i, int j)
  189. {
  190.     int tmp;                 // функция замены i и j эл-тов в массиве a
  191.     tmp = a[i];
  192.     a[i] = a[j];
  193.     a[j] = tmp;
  194. }
  195.  
  196.  
  197.  
  198. // FOR(a,l,r,l,las);
  199. void FOR(int *a, int l, int r, int i, int &las)
  200. {
  201.     if (i > r) return;
  202.     if (a[i]<a[l])
  203.         swap(a, ++las, i);
  204.     FOR(a,l,r,++i,las);
  205. }
Add Comment
Please, Sign In to add comment