luisoncpp

Clase de Recursividad

Dec 7th, 2020 (edited)
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.21 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. namespace {
  4. using namespace std;
  5.  
  6. template<typename T>
  7. void Imprimir(const T& arreglo, string separador = " ") {
  8.   for (const auto& a : arreglo) {
  9.     cout << a << separador;
  10.   }
  11.   cout << endl;
  12. }
  13.  
  14. void ImprimirEnBinario(int N) {
  15.   //if (N >= 2) {
  16.     ImprimirEnBinario(N / 2);
  17.   //}
  18.   cout << N % 2;
  19. }
  20.  
  21. void PruebaPila(int N) {
  22.   if (N == 0) {
  23.     return;
  24.   }
  25.   cout << N << " ";
  26.   if (N % 2 == 0) {
  27.     PruebaPila(N - 1);
  28.     cout << "P";
  29.   } else {
  30.     PruebaPila(N - 1);
  31.     cout << "I";
  32.   }
  33.   cout << N << " ";
  34. }
  35.  
  36. using Imagen = vector<string>;
  37. Imagen SierpinskyCuadrado(int niveles) {
  38.   if (niveles == 1) {
  39.     return {
  40.       "##",
  41.       "# "
  42.       };
  43.   }
  44.   auto cuarto_de_imagen = SierpinskyCuadrado(niveles - 1);
  45.   Imagen salida;
  46.   for (const string& linea : cuarto_de_imagen) {
  47.     salida.push_back(linea + linea);
  48.   }
  49.   for (const string& linea : cuarto_de_imagen) {
  50.     salida.push_back(linea + string(linea.size(), ' '));
  51.   }
  52.   return salida;
  53. }
  54.  
  55. // 1 + 2 + 3 + 4 + 5 + 6 + ... + N
  56. int Sum(int N) {
  57.   if (N == 0) {
  58.     return 0;
  59.   }
  60.   if (N % 2) {
  61.     return N + Sum(N-1);
  62.   }
  63.   int sum_mitad = Sum(N / 2);
  64.   return 2*sum_mitad + (N / 2) * (N / 2);
  65. }
  66.  
  67. double AreaSector(double x, double y, int niveles) {
  68.   double xmedio = x + (1.0 - x) / 2;
  69.   double ymedio = y / 2;
  70.   if (niveles == 1) {
  71.     return ymedio;
  72.   }
  73.   double norma = sqrt(xmedio*xmedio + ymedio*ymedio);
  74.   double area_mitad = AreaSector(xmedio / norma, ymedio / norma, niveles - 1);
  75.   return area_mitad * 2.0;
  76. }
  77.  
  78. vector<string> GeneraCadenas(const string& alfabeto, int longitud) {
  79.   if (longitud == 0) {
  80.     return {""};
  81.   }
  82.   vector<string> prefijos = GeneraCadenas(alfabeto, longitud - 1);
  83.   vector<string> salida;
  84.   salida.reserve(prefijos.size() * alfabeto.size());
  85.   for (const string& p : prefijos) {
  86.     for (char c : alfabeto) {
  87.       salida.push_back(p + c);
  88.     }
  89.   }
  90.   return salida;
  91. }
  92.  
  93. void ImprimePermutaciones(string& cadena, int indice = 0) {
  94.   if (indice == cadena.size()) {
  95.     cout << cadena << endl;
  96.     return;
  97.   }
  98.   for (int i = indice; i < cadena.size(); ++i) {
  99.     swap(cadena[i], cadena[indice]);
  100.     ImprimePermutaciones(cadena, indice + 1);
  101.     swap(cadena[i], cadena[indice]);
  102.   }
  103. }
  104.  
  105. void MergeSortLegacy(vector<int>& arreglo) {
  106.   int N = arreglo.size();
  107.   if (N < 2) {
  108.     return;
  109.   }
  110.   vector<int> izq(arreglo.begin(), arreglo.begin() + N / 2);
  111.   vector<int> der(arreglo.begin() + N / 2, arreglo.end());
  112.   MergeSortLegacy(izq);
  113.   MergeSortLegacy(der);
  114.   int i = 0, d = 0;
  115.   arreglo.clear();
  116.   while (i < izq.size() || d < der.size()) {
  117.     if (i < izq.size() && (d == der.size() || izq[i] < der[d])) {
  118.       arreglo.push_back(izq[i]);
  119.       ++i;
  120.       continue;
  121.     }
  122.     arreglo.push_back(der[d]);
  123.     ++d;
  124.   }
  125. }
  126. // Ordena los nĂºmeros desde inicio hasta fin, sin incluir fin
  127. void MergeSort(int* inicio, int* fin) {
  128.   if (fin - inicio < 2) {
  129.     return;
  130.   }
  131.   int* centro = inicio + (fin - inicio) / 2;
  132.   MergeSort(inicio, centro);
  133.   MergeSort(centro, fin);
  134.   vector<int> izq(inicio, centro);
  135.   vector<int> der(centro, fin);
  136.   int* salida = fin - 1;
  137.   while (!izq.empty() || !der.empty()) {
  138.     if (!izq.empty() && (der.empty() || izq.back() > der.back())) {
  139.       *salida = izq.back();
  140.       izq.pop_back();
  141.     } else {
  142.       *salida = der.back();
  143.       der.pop_back();
  144.     }
  145.     --salida;
  146.   }
  147. }
  148.  
  149. void ProbarMergeSort(int N) {
  150.   vector<int> prueba;
  151.   for (int i = 1; i <= N; ++i) {
  152.     prueba.push_back(i);
  153.   }
  154.   random_shuffle(prueba.begin(), prueba.end());
  155.   Imprimir(prueba);
  156.   MergeSort(&prueba[0], &prueba[0] + N);
  157.   Imprimir(prueba);
  158. }
  159.  
  160. }
  161.  
  162. int main() {
  163.   ProbarMergeSort(100);
  164.   //printf("%.50lf\n", AreaSector(0, 1.0, 100) * 4.0);
  165.   //Imprimir(SierpinskyCuadrado(6), "\n");
  166.   //ImprimirEnBinario(1024 + 128 + 64 + 2 + 1);
  167.  
  168.   //PruebaPila(10);
  169.   //cout << endl;
  170.  
  171.   /*ImprimirEnBinario(1024 + 128 + 64 + 2 + 1);
  172.   cout << endl;
  173.   cout << Sum(1023) << std::endl;
  174.   cout << AreaSector(0, 1.0, 20) * 4.0 << std::endl;
  175.   ProbarMergeSort(100);
  176.   Imprimir(GeneraCadenas("axz", 3));
  177.   Imprimir(SierpinskyCuadrado(6), "\n");
  178.   string cadena = "abc";
  179.   ImprimePermutaciones(cadena, 0);*/
  180.   return 0;
  181. }
Add Comment
Please, Sign In to add comment