La recursión mutua es una recursión de variación . Dos funciones se llaman mutuamente recursivas si la primera función hace una llamada recursiva a la segunda función y la segunda función, a su vez, llama a la primera.
En el desarrollo de software, este concepto se utiliza en la dependencia circular, que es una relación entre dos o más módulos que, directa o indirectamente, dependen entre sí para funcionar correctamente. Dichos módulos también se conocen como mutuamente recursivos.
Un gran ejemplo de recursividad mutua sería implementar la Secuencia de Hofstadter.
Secuencia de Hofstader
En matemáticas, una secuencia de Hofstadter es un miembro de una familia de secuencias enteras relacionadas definidas por relaciones de recurrencia no lineal . En este ejemplo nos vamos a centrar en las secuencias Hembra y Macho de Hofstadter:
C++
// C++ program to implement Hofstader Sequence // using mutual recursion #include <bits/stdc++.h> using namespace std; int hofstaderFemale(int); int hofstaderMale(int); // Female function int hofstaderFemale(int n) { if (n < 0) return 0; else if (n == 0) return 1; else return (n - hofstaderFemale(n - 1)); } // Male function int hofstaderMale(int n) { if (n < 0) return 0; else if (n == 0) return 0; else return (n - hofstaderMale(n - 1)); } // Driver Code int main() { int i; cout << "F: "; for (i = 0; i < 20; i++) cout << hofstaderFemale(i) << " "; cout << "\n"; cout << "M: "; for (i = 0; i < 20; i++) cout << hofstaderMale(i)<< " "; return 0; } // This code is contributed by shubhamsingh10
C
// C program to implement Hofstader Sequence // using mutual recursion #include <stdio.h> int hofstaderFemale(int); int hofstaderMale(int); // Female function int hofstaderFemale(int n) { if (n < 0) return; else return (n == 0) ? 1 : n - hofstaderFemale(n - 1); } // Male function int hofstaderMale(int n) { if (n < 0) return; else return (n == 0) ? 0 : n - hofstaderMale(n - 1); } // hard coded driver function to run the program int main() { int i; printf("F: "); for (i = 0; i < 20; i++) printf("%d ", hofstaderFemale(i)); printf("\n"); printf("M: "); for (i = 0; i < 20; i++) printf("%d ", hofstaderMale(i)); return 0; }
Java
// Java program to implement Hofstader // Sequence using mutual recursion import java .io.*; class GFG { // Female function static int hofstaderFemale(int n) { if (n < 0) return 0; else return (n == 0) ? 1 : n - hofstaderFemale(n - 1); } // Male function static int hofstaderMale(int n) { if (n < 0) return 0; else return (n == 0) ? 0 : n - hofstaderMale(n - 1); } // Driver Code static public void main (String[] args) { int i; System.out.print("F: "); for (i = 0; i < 20; i++) System.out.print(hofstaderFemale(i) + " "); System.out.println(); System.out.print("M: "); for (i = 0; i < 20; i++) System.out.print(hofstaderMale(i) + " "); } } // This code is contributed by anuj_67.
Python3
# Python program to implement # Hofstader Sequence using # mutual recursion # Female function def hofstaderFemale(n): if n < 0: return; else: val = 1 if n == 0 else ( n - hofstaderFemale(n - 1)) return val # Male function def hofstaderMale(n): if n < 0: return; else: val = 0 if n == 0 else ( n - hofstaderMale(n - 1)) return val # Driver code print("F:", end = " ") for i in range(0, 20): print(hofstaderFemale(i), end = " ") print("\n") print("M:", end = " ") for i in range(0, 20): print(hofstaderMale(i), end = " ") # This code is contributed # by Shantanu Sharma
C#
// C# program to implement Hofstader // Sequence using mutual recursion using System; class GFG { // Female function static int hofstaderFemale(int n) { if (n < 0) return 0; else return (n == 0) ? 1 : n - hofstaderFemale(n - 1); } // Male function static int hofstaderMale(int n) { if (n < 0) return 0; else return (n == 0) ? 0 : n - hofstaderMale(n - 1); } // Driver Code static public void Main () { int i; Console.WriteLine("F: "); for (i = 0; i < 20; i++) Console.Write(hofstaderFemale(i) + " "); Console.WriteLine(); Console.WriteLine("M: "); for (i = 0; i < 20; i++) Console.Write(hofstaderMale(i) + " "); } } // This code is contributed by Ajit.
PHP
<?php // PHP program to implement // Hofstader Sequence // using mutual recursion //function hofstaderFemale(int); //int hofstaderMale(int); // Female function function hofstaderFemale($n) { if ($n < 0) return; else return ($n == 0) ? 1 : $n - hofstaderFemale($n - 1); } // Male function function hofstaderMale($n) { if ($n < 0) return; else return ($n == 0) ? 0 : $n - hofstaderMale($n - 1); } // Driver Code $i; echo "F: "; for ($i = 0; $i < 20; $i++) echo hofstaderFemale($i), " "; echo "\n"; echo "M: "; for ($i = 0; $i < 20; $i++) echo hofstaderMale($i), " "; // This code contributed by Ajit ?>
Javascript
<script> // Javascript program to implement Hofstader // Sequence using mutual recursion // Female function function hofstaderFemale(n) { if (n < 0) return 0; else return (n == 0) ? 1 : n - hofstaderFemale(n - 1); } // Male function function hofstaderMale(n) { if (n < 0) return 0; else return (n == 0) ? 0 : n - hofstaderMale(n - 1); } // Driver code let i; document.write("F: "); for(i = 0; i < 20; i++) document.write(hofstaderFemale(i) + " "); document.write("</br>"); document.write("M: "); for(i = 0; i < 20; i++) document.write(hofstaderMale(i) + " "); // This code is contributed by rameshtravel07 </script>
Producción:
F: 1 0 2 1 3 2 4 3 5 4 6 5 7 6 8 7 9 8 10 9 M: 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10
Desventajas de la dependencia circular/recursión mutua:
- Las dependencias circulares pueden causar un efecto dominó cuando un pequeño cambio local en un módulo se propaga a otros módulos y tiene efectos globales no deseados.
- Las dependencias circulares también pueden generar recurrencias infinitas u otros errores inesperados.
- Las dependencias circulares también pueden causar fugas de memoria al evitar que ciertos recolectores de basura automáticos muy primitivos (aquellos que usan el conteo de referencias) desasignen objetos no utilizados.
Referencias: Wikipedia
Este artículo es una contribución de Palash Nigam . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA