Problemas de recursividad

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Responder
rovic
Mensajes: 11
Registrado: 01 Feb 2015, 03:28

Problemas de recursividad

Mensaje por rovic »

Cuando hago una función recursiva a partir de la segunda llamada no funciona: Return SetError. Al menos no devuelve la función SetError el valor del argumento pasado en el tercer parámetro. Al parecer el problema está en la función Return.

;#Include <FF.au3>
#Region Include
#include-once
#include <StringConstants.au3>
#EndRegion

$resultAna = AnalizarVersionProgram("6.5.310","6.5.10")
Exit MsgBox(64,"Información",$resultAna)

Func AnalizarVersionProgram($version, $versionText)
If Not $versionText Then Return SetError(1,0,"No se ha especificado ninguna versión para la comparación.")
$resultAnaExp = StringRegExp($versionText,"^\.|[^0-9\.]|.\D\.|\.$")
If @error Then
Return SetError(2,0,"Información sobre el error: " & @extended)
EndIf
If $resultAnaExp Then Return SetError(3,0,"La versión especificada no cumple con la estrutura consebida para la comparación.")
$posPtoVersion = StringInStr($version,".")
$posPtoVersionText = StringInStr($versionText,".")
$result = ($posPtoVersion?Int(StringLeft($version,$posPtoVersion-1)):Int($version)) _
- ($posPtoVersionText?Int(StringLeft($versionText,$posPtoVersionText-1)):Int($versionText))
Select
Case $result > 0
Return SetError(0,2,"<")
Case $result < 0
Return SetError(0,2,">")
Case $result = 0
If $posPtoVersionText And Not $posPtoVersion Then Return SetError(0,3,">=")
If $posPtoVersion And Not $posPtoVersionText Then Return SetError(0,4,"<")
If Not $posPtoVersion And Not $posPtoVersionText Then Return SetError(0,5,"=")
AnalizarVersionProgram(StringMid($version,$posPtoVersion + 1),StringMid($versionText,$posPtoVersionText + 1))
EndSelect
EndFunc
Última edición por rovic el 15 Feb 2016, 22:52, editado 1 vez en total.
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Problemas de recursividad

Mensaje por Chefito »

Pon el código y te podremos ayudar :smt024 .
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
rovic
Mensajes: 11
Registrado: 01 Feb 2015, 03:28

Re: Problemas de recursividad

Mensaje por rovic »

Ya yo le he puesto en el mensaje de inicio, gracias por la información.
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Problemas de recursividad

Mensaje por Chefito »

Exactamente que es lo que quieres hacer? Porque no se yo si lo adecuado seria con recursividad :smt012 . Explica lo que pretendes y el resultado o resultados que deberia dar.

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
rovic
Mensajes: 11
Registrado: 01 Feb 2015, 03:28

Re: Problemas de recursividad

Mensaje por rovic »

Creo que existen otras maneras de lograrlo pero me parecio que habia encontrado un error con el autoit que podia ser corregido. El problema es que hay veces que las opciones de elegir son mas limitadas y quizas en con otro codigo no tendria otras opciones. Gracias por la atencion. Pero revisastes el codigo?
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: Problemas de recursividad

Mensaje por Dany »

Hola.

Código: Seleccionar todo

;#Include <FF.au3>
#Region Include
#include-once
#include <StringConstants.au3>
#EndRegion Include

$resultAna = AnalizarVersionProgram("6.5.310", "6.5.310")
Exit MsgBox(64, "Información", $resultAna)

Func AnalizarVersionProgram($version, $versionText)
	If Not $versionText Then Return SetError(1, 0, "No se ha especificado ninguna versión para la comparación.")
	$resultAnaExp = StringRegExp($versionText, "^\.|[^0-9\.]|.\D\.|\.$")
	If @error Then
		Return SetError(2, 0, "Información sobre el error: " & @extended)
	EndIf
	If $resultAnaExp Then Return SetError(3, 0, "La versión especificada no cumple con la estrutura consebida para la comparación.")
	$posPtoVersion = StringInStr($version, ".")
	$posPtoVersionText = StringInStr($versionText, ".")
	$result = ($posPtoVersion ? Int(StringLeft($version, $posPtoVersion - 1)) : Int($version)) _
			 - ($posPtoVersionText ? Int(StringLeft($versionText, $posPtoVersionText - 1)) : Int($versionText))
	Select
		Case $result > 0
			Return SetError(0, 2, "<")
		Case $result < 0
			Return SetError(0, 2, ">")
		Case $result = 0
			If $posPtoVersionText And Not $posPtoVersion Then Return SetError(0, 3, ">=")
			If $posPtoVersion And Not $posPtoVersionText Then Return SetError(0, 4, "<")
			If Not $posPtoVersion And Not $posPtoVersionText Then Return SetError(0, 5, "=")
			Return AnalizarVersionProgram(StringMid($version, $posPtoVersion + 1), StringMid($versionText, $posPtoVersionText + 1))
	EndSelect

EndFunc   ;==>AnalizarVersionProgram

Saludos :smt027
  • ............................................Imagen
    ......................................Imagen
rovic
Mensajes: 11
Registrado: 01 Feb 2015, 03:28

Re: Problemas de recursividad

Mensaje por rovic »

Gracias Dany
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Problemas de recursividad

Mensaje por Chefito »

Perdona, la verdad es que casi ni miré el código :smt005 . Viéndolo un poco por encima, se sabe perfectamente lo que quieres hacer....o simplemente viendo el nombre de la función :smt003 .
Yo para eso no utilizaría recursividad. La recursividad se suele utilizar para otros casos con finales inciertos y difíciles de programar de forma iterativa. Pero en este caso le va muy bien una iteración.
Yo lo haría así:

Código: Seleccionar todo

Local $resultAna, $valor

$resultAna = AnalizarVersionProgram("6.5.310", "6.5.310")

Switch $resultAna
   Case 1
	  $valor="mayor"
   Case 0
	  $valor="igual"
   Case -1
	  $valor="menor"
EndSwitch

MsgBox(0,"Resultado","La versión del primer programa es " & $valor & " que la versión del segundo programa")

Func AnalizarVersionProgram($version1, $version2)
   Local $aVersion1, $aVersion2
   $aVersion1=StringSplit($version1, ".")
   $aVersion2=StringSplit($version2, ".")
   For $n=1 to $aVersion1[0]
	  If Number($aVersion1[$n])>Number($aVersion2[$n]) Then
		 Return 1	;mayor
	  ElseIf Number($aVersion1[$n])<Number($aVersion2[$n]) Then
		 Return -1	;menor
	  EndIf
   Next
   Return 0	;igual
EndFunc
Esta función está realizada siempre que tenga los mismos bloques (los mismos puntos). Si una de las versiones tiene más o menos puntos se tendría que variar un poco, pero poco :smt023 :smt024 .

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
rovic
Mensajes: 11
Registrado: 01 Feb 2015, 03:28

Re: Problemas de recursividad

Mensaje por rovic »

Muchas gracias y valida la propuesta. Y sobre el problema con la recursividad pudiste ver algo?
Responder