Problema de recursividad en VB

Iniciado por Anabel3, 26 Junio 2012, 07:17 AM

0 Miembros y 1 Visitante están viendo este tema.

Anabel3

Hola!

Por favor necesito ayuda urgente.
Soy una principiante en la programación.
Tengo un trabajo de la facu que me esta dando dolores de cabeza hace semanas, porque no el encuentro donde esta fallando mi código.
:huh:

Tengo que realizar un programa que dibujo la alfombra de sierpinski utilizando recursividad,
una introducción al tema lo vana a encontrar aqui:
[url]http://es.wikipedia.org/wiki/Alfombra_de_Sierpinski[url]

La construcción de la alfombra de Sierpinski se define de forma recursiva:
1º) Comenzamos con un cuadrado.
2º)El cuadrado se corta en 9 cuadrados congruentes, y eliminamos el cuadrado central.
3º) El paso anterior vuelve a aplicarse recursivamente a cada uno de los 8 cuadrados restantes.

El programa que cree posee una función que dibuja el cuadrado y lo divide en 9 cuadrados, y esta función se llama a sí misma 8 veces.
El problema es que la llamada a la función se queda en la 1º de las 8, por ello es que no se crea la alfombra en su totalidad.

Es decir que para el nivel de recursividad igual o mayor a 2, se crea un cuadrado que es divido en 9 cuadrados. Y cada uno de estos cuadrados  deben ser divididos en 9 cuadrados a su vez y asi sucesivamente (dependiendo el nivel de recursividad que determine). Pero nose porque la división de cuadrados solo se aplica en el 1º de los 9 cuadrados.

Se entiende??
Desde ya agradezco cualquier ayuda que puedan brindarme.

Aca esta el código principal de mi programa, la llamada que  inicia  esta clase se realiza desde otro formulario donde se define el nivel de recursividad, (N) que varia desde 0 a 10.

Código (vbnet) [Seleccionar]

Public Class Alfombra

    Inherits System.Windows.Forms.Form
    Public nIteracion As Integer
    Public x, y, ancho, alto As Double


    Public Sub iniciar_Alfombra(ByRef n As Integer, ByRef x As Double, ByRef y As Double, ByRef ancho As Double, ByRef alto As Double)


        If n = 0 Then

            dibujar_Rectangulo(x, y, ancho, alto)

        Else

            calcular_Rectangulo(n, x, y, ancho, alto)

        End If

    End Sub



    Public Sub calcular_Rectangulo(ByRef n As Integer, ByRef x As Double, ByRef y As Double, ByRef ancho As Double, ByRef alto As Double)

        Dim x1, x2, x3, x4, x5, x6, x7, x8 As Double
        Dim y1, y2, y3, y4, y5, y6, y7, y8 As Double
        Dim nuevo_Ancho, nuevo_Alto As Double

        If n > 0 Then

            n = n - 1
            nuevo_Ancho = ancho / 3     '1/3 del ancho
            nuevo_Alto = alto / 3       '1/3 del alto


            ' Primer rectangulo. Punto origen
            dibujar_Rectangulo(x, y, nuevo_Ancho, nuevo_Alto)

            ' Segundo rectangulo
            x1 = x + nuevo_Ancho
            y1 = y
            dibujar_Rectangulo(x1, y1, nuevo_Ancho, nuevo_Alto)

            ' Tercer rectangulo
            x2 = x + (2 * nuevo_Ancho)
            y2 = y
            dibujar_Rectangulo(x2, y2, nuevo_Ancho, nuevo_Alto)

            ' Cuarto rectangulo
            x3 = x
            y3 = y + nuevo_Alto
            dibujar_Rectangulo(x3, y3, nuevo_Ancho, nuevo_Alto)


            ' Quinto rectangulo: rectangulo del centro
            'x4 = x + nuevo_Ancho
            'y4 = y + nuevo_Alto
            'Sierpinski.pbDibujo.CreateGraphics.DrawRectangle(Pens.White, CInt(x4), CInt(y4), CInt(nuevo_Ancho), CInt(nuevo_Alto))
            'Sierpinski.pbDibujo.CreateGraphics.FillRectangle(Brushes.White, CInt(x4), CInt(y4), CInt(nuevo_Ancho), CInt(nuevo_Alto))


            ' Sexto rectangulo
            x5 = x + (2 * nuevo_Ancho)
            y5 = y + nuevo_Alto
            dibujar_Rectangulo(x5, y5, nuevo_Ancho, nuevo_Alto)

            ' Septimo rectangulo
            x6 = x
            y6 = y + (2 * nuevo_Alto)
            dibujar_Rectangulo(x6, y6, nuevo_Ancho, nuevo_Alto)

            ' Octavo rectangulo
            x7 = x + nuevo_Ancho
            y7 = y + (2 * nuevo_Alto)
            dibujar_Rectangulo(x7, y7, nuevo_Ancho, nuevo_Alto)

            ' Noveno rectangulo
            x8 = x + (2 * nuevo_Ancho)
            y8 = y + (2 * nuevo_Alto)
            dibujar_Rectangulo(x8, y8, nuevo_Ancho, nuevo_Alto)

            ' Se llama a sí mismo 8 veces
            Call calcular_Rectangulo(n, x, y, nuevo_Ancho, nuevo_Alto)
            Call calcular_Rectangulo(n, x1, y1, nuevo_Ancho, nuevo_Alto)
            Call calcular_Rectangulo(n, x2, y2, nuevo_Ancho, nuevo_Alto)
            Call calcular_Rectangulo(n, x3, y3, nuevo_Ancho, nuevo_Alto)
            Call calcular_Rectangulo(n, x5, y5, nuevo_Ancho, nuevo_Alto)
            Call calcular_Rectangulo(n, x6, y6, nuevo_Ancho, nuevo_Alto)
            Call calcular_Rectangulo(n, x7, y7, nuevo_Ancho, nuevo_Alto)
            Call calcular_Rectangulo(n, x8, y8, nuevo_Ancho, nuevo_Alto)


        End If

    End Sub

    Public Sub dibujar_Rectangulo(ByVal x As Double, ByVal y As Double, ByVal ancho As Double, ByVal alto As Double)

        Sierpinski.pbDibujo.CreateGraphics.DrawRectangle(Pens.CornflowerBlue, CInt(x), CInt(y), CInt(ancho), CInt(alto))
        'Sierpinski.pbDibujo.CreateGraphics.FillRectangle(Brushes.CornflowerBlue, CInt(x), CInt(y), CInt(ancho), CInt(alto))

    End Sub


End Class