Recursión mutua con ejemplo de secuencias Hofstadter Hembra y Macho

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: 

F ( 0 ) = 1
M ( 0 ) = 0 
F ( n ) = n - M ( F ( n - 1 ) ), n > 0 
M ( n ) = n - F ( M ( n - 1 ) ), n > 0. 

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:  

  1. 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.
  2. Las dependencias circulares también pueden generar recurrencias infinitas u otros errores inesperados.
  3. 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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *