Funciones Recursivas


Objetivo: Funciones Recursivas
Buenas!.

Normalmente las funciones recursivas hacen un proceso local, pero, ¿ no suelen ser usadas para devolver un valor ?.
A menos que el valor pasado como parámetro sea una variable global o pública, digo yo.

Me propuse mediante una función recursiva encontrar el valor mayor de un array. Pero la función recursiva
trabaja de una forma que al llegar al final de la función se ejecuta varias veces y sale ( lo podéis ver con F8 ),
puede que no sea la forma correcta.

Os muestro el código: ( Supuestamente recursividad lineal ).

Public Sub Main()

Dim inumeros As Integer[] = [3, 1, 5]

Print ValorMaximo(inumeros)

End

Public Function ValorMaximo(lista As Integer[], Optional mayor As Integer, Optional cuenta As Integer) As Integer

If cuenta < lista.Count Then
mayor = Max(mayor, lista[cuenta])
Print mayor
ValorMaximo(lista, mayor, cuenta + 1)
Else
Return mayor
Endif

End


El resultado es este:

Citar:

3
3
5
0


0 Es lo que imprime o devuelve la función al final.
Digamos que si añadimos al final de la función recursiva algo como esto:

Public Function ValorMaximo(lista As Integer[], Optional mayor As Integer, Optional cuenta As Integer) As Integer

If cuenta < lista.Count Then
mayor = Max(mayor, lista[cuenta])
Print mayor
ValorMaximo(lista, mayor, cuenta + 1)
Else
Return mayor
Endif
Print "Esto se va a ejecutar también"

End


El resultado seria este:

Citar:

3
3
5
Esto se va a ejecutar también.
Esto se va a ejecutar también.
Esto se va a ejecutar también.
0


El mensaje se ejecutaría tantas veces como veces se ejecuta la función. Eso si, al final.
Pero ¿ que hace ese 0 ahí ?. Es como si devolviese nada.

Como veis la condicional, si ha llegado al limite devuelve el valor y hasta ahí. (Eso si fuera una función iterativa).
Pero parece que algo recursivo no trabaja así.

Saludos

Objetivo: Re: Funciones Recursivas
Algo debo haber hecho mal en la función anterior.

Public Sub Main()

Print Factorial(4)

End

Public Function Factorial(n As Integer) As Integer

If n = 0 Then
Return 1
Else
Return n * Factorial(n - 1)
Endif
Print "Se ejecuta también"

End


Devuelve:

Citar:

24


Ale, a repasar toca.

Saludos

Objetivo: Re: Funciones Recursivas
Buenas!.

De esta forma funciona:

Public Function ValorMaximo(lista As Integer[], Optional mayor As Integer, Optional cuenta As Integer) As Integer

If cuenta < lista.Count Then
mayor = Max(mayor, lista[cuenta])
Return ValorMaximo(lista, mayor, cuenta + 1)
Else
Return mayor
Endif
Print "Esto no se ejecuta"

End


Salida:

Citar:

5


Se va ejecutando el primer return que se llama a si misma y al final devuelve el valor en el último return.
En ese caso no llega al print del final de la función.

Saludos


Página 1 de 1


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.0889s (PHP: -14% SQL: 114%)
Consultas SQL: 22 - Debug off - GZIP Activado