Hace tiempo propuse un reto de buscar una letra en una palabra, debía intentarse en una sola linea.
He hecho otro tipo de ejemplos, pretendía usar distintas formas para hacer lo mismo, pero con un código mayor.
En el primer ejemplo, devuelve un array con las posiciones donde se encuentra la letra.
Y en los restantes, he usado recursividad, el segundo ejemplo no acaba de convencerme, pero es sin usar una función de busqueda.
Y en el tercero he usado recursividad y una función para buscar las posiciones donde esta la letra.
Naturalmente el tercer ejemplo con recursividad es más rápido que el segundo.
Public Sub Main()
Dim posletra As New Integer[]
'encontrar_coincidencias1
'posletra = encontrar_coincidencias1("arboleda", "a")
'Mostrar_Array(posletra)
'encontrar_coincidencias2("gambas", "a", 1)
'encontrar_coincidencias2("esternocleidomastoideo", "e", 1)
encontrar_coincidencias3("esternocleidomastoideo", "e", 1)
End
Public Sub Mostrar_Array(lista As Integer[])
Dim elemento As Integer
For Each elemento In lista
Print elemento
Next
End
Public Function encontrar_coincidencias1(s As String, l As String) As Integer[]
Dim posiciones As New Integer[]
Dim x As Integer
For x = 1 To Len(s)
If Mid$(s, x, 1) = l Then
posiciones.Add(x)
Endif
Next
Return posiciones
End
Public Sub encontrar_coincidencias2(s As String, l As String, pos As Integer)
If pos > Len(s) Then
Return
Else
If Mid$(s, pos, 1) = l Then
Print pos
Endif
encontrar_coincidencias2(s, l, (pos + 1))
Endif
End
Public Sub encontrar_coincidencias3(s As String, l As String, pos As Integer)
pos = InStr(s, l, pos)
If pos <> 0 Then
Print pos
encontrar_coincidencias3(s, l, (pos + 1))
Else
Return
Endif
End
Dim posletra As New Integer[]
'encontrar_coincidencias1
'posletra = encontrar_coincidencias1("arboleda", "a")
'Mostrar_Array(posletra)
'encontrar_coincidencias2("gambas", "a", 1)
'encontrar_coincidencias2("esternocleidomastoideo", "e", 1)
encontrar_coincidencias3("esternocleidomastoideo", "e", 1)
End
Public Sub Mostrar_Array(lista As Integer[])
Dim elemento As Integer
For Each elemento In lista
Print elemento
Next
End
Public Function encontrar_coincidencias1(s As String, l As String) As Integer[]
Dim posiciones As New Integer[]
Dim x As Integer
For x = 1 To Len(s)
If Mid$(s, x, 1) = l Then
posiciones.Add(x)
Endif
Next
Return posiciones
End
Public Sub encontrar_coincidencias2(s As String, l As String, pos As Integer)
If pos > Len(s) Then
Return
Else
If Mid$(s, pos, 1) = l Then
Print pos
Endif
encontrar_coincidencias2(s, l, (pos + 1))
Endif
End
Public Sub encontrar_coincidencias3(s As String, l As String, pos As Integer)
pos = InStr(s, l, pos)
If pos <> 0 Then
Print pos
encontrar_coincidencias3(s, l, (pos + 1))
Else
Return
Endif
End
Como veis, he tenido que usar un parámetro para decirle que comience en la posición 1. No lo puedo hacer opcional.
Podría haber creado una variable global, pero no es bueno acostumbrarse a esto.
Ahora pregunto, ¿ Cómo haríais sin usar una variable global que las funciones recursivas devuelvan una array con las posiciones donde se encuentra la letra a buscar ?.
Saludos