Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Anabel3 en 26 Junio 2012, 07:17 am



Título: Problema de recursividad en VB
Publicado por: Anabel3 en 26 Junio 2012, 07:17 am
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
  1. Public Class Alfombra
  2.  
  3.    Inherits System.Windows.Forms.Form
  4.    Public nIteracion As Integer
  5.    Public x, y, ancho, alto As Double
  6.  
  7.  
  8.    Public Sub iniciar_Alfombra(ByRef n As Integer, ByRef x As Double, ByRef y As Double, ByRef ancho As Double, ByRef alto As Double)
  9.  
  10.  
  11.        If n = 0 Then
  12.  
  13.            dibujar_Rectangulo(x, y, ancho, alto)
  14.  
  15.        Else
  16.  
  17.            calcular_Rectangulo(n, x, y, ancho, alto)
  18.  
  19.        End If
  20.  
  21.    End Sub
  22.  
  23.  
  24.  
  25.    Public Sub calcular_Rectangulo(ByRef n As Integer, ByRef x As Double, ByRef y As Double, ByRef ancho As Double, ByRef alto As Double)
  26.  
  27.        Dim x1, x2, x3, x4, x5, x6, x7, x8 As Double
  28.        Dim y1, y2, y3, y4, y5, y6, y7, y8 As Double
  29.        Dim nuevo_Ancho, nuevo_Alto As Double
  30.  
  31.        If n > 0 Then
  32.  
  33.            n = n - 1
  34.            nuevo_Ancho = ancho / 3     '1/3 del ancho
  35.            nuevo_Alto = alto / 3       '1/3 del alto
  36.  
  37.  
  38.            ' Primer rectangulo. Punto origen
  39.            dibujar_Rectangulo(x, y, nuevo_Ancho, nuevo_Alto)
  40.  
  41.            ' Segundo rectangulo
  42.            x1 = x + nuevo_Ancho
  43.            y1 = y
  44.            dibujar_Rectangulo(x1, y1, nuevo_Ancho, nuevo_Alto)
  45.  
  46.            ' Tercer rectangulo
  47.            x2 = x + (2 * nuevo_Ancho)
  48.            y2 = y
  49.            dibujar_Rectangulo(x2, y2, nuevo_Ancho, nuevo_Alto)
  50.  
  51.            ' Cuarto rectangulo
  52.            x3 = x
  53.            y3 = y + nuevo_Alto
  54.            dibujar_Rectangulo(x3, y3, nuevo_Ancho, nuevo_Alto)
  55.  
  56.  
  57.            ' Quinto rectangulo: rectangulo del centro
  58.            'x4 = x + nuevo_Ancho
  59.            'y4 = y + nuevo_Alto
  60.            'Sierpinski.pbDibujo.CreateGraphics.DrawRectangle(Pens.White, CInt(x4), CInt(y4), CInt(nuevo_Ancho), CInt(nuevo_Alto))
  61.            'Sierpinski.pbDibujo.CreateGraphics.FillRectangle(Brushes.White, CInt(x4), CInt(y4), CInt(nuevo_Ancho), CInt(nuevo_Alto))
  62.  
  63.  
  64.            ' Sexto rectangulo
  65.            x5 = x + (2 * nuevo_Ancho)
  66.            y5 = y + nuevo_Alto
  67.            dibujar_Rectangulo(x5, y5, nuevo_Ancho, nuevo_Alto)
  68.  
  69.            ' Septimo rectangulo
  70.            x6 = x
  71.            y6 = y + (2 * nuevo_Alto)
  72.            dibujar_Rectangulo(x6, y6, nuevo_Ancho, nuevo_Alto)
  73.  
  74.            ' Octavo rectangulo
  75.            x7 = x + nuevo_Ancho
  76.            y7 = y + (2 * nuevo_Alto)
  77.            dibujar_Rectangulo(x7, y7, nuevo_Ancho, nuevo_Alto)
  78.  
  79.            ' Noveno rectangulo
  80.            x8 = x + (2 * nuevo_Ancho)
  81.            y8 = y + (2 * nuevo_Alto)
  82.            dibujar_Rectangulo(x8, y8, nuevo_Ancho, nuevo_Alto)
  83.  
  84.            ' Se llama a sí mismo 8 veces
  85.            Call calcular_Rectangulo(n, x, y, nuevo_Ancho, nuevo_Alto)
  86.            Call calcular_Rectangulo(n, x1, y1, nuevo_Ancho, nuevo_Alto)
  87.            Call calcular_Rectangulo(n, x2, y2, nuevo_Ancho, nuevo_Alto)
  88.            Call calcular_Rectangulo(n, x3, y3, nuevo_Ancho, nuevo_Alto)
  89.            Call calcular_Rectangulo(n, x5, y5, nuevo_Ancho, nuevo_Alto)
  90.            Call calcular_Rectangulo(n, x6, y6, nuevo_Ancho, nuevo_Alto)
  91.            Call calcular_Rectangulo(n, x7, y7, nuevo_Ancho, nuevo_Alto)
  92.            Call calcular_Rectangulo(n, x8, y8, nuevo_Ancho, nuevo_Alto)
  93.  
  94.  
  95.        End If
  96.  
  97.    End Sub
  98.  
  99.    Public Sub dibujar_Rectangulo(ByVal x As Double, ByVal y As Double, ByVal ancho As Double, ByVal alto As Double)
  100.  
  101.        Sierpinski.pbDibujo.CreateGraphics.DrawRectangle(Pens.CornflowerBlue, CInt(x), CInt(y), CInt(ancho), CInt(alto))
  102.        'Sierpinski.pbDibujo.CreateGraphics.FillRectangle(Brushes.CornflowerBlue, CInt(x), CInt(y), CInt(ancho), CInt(alto))
  103.  
  104.    End Sub
  105.  
  106.  
  107. End Class
  108.