Convertir la iteración en recursividad.

Quiero verificar si el usuario de la string ingresada tiene una cantidad equilibrada de ( y )

ex. ()( no está equilibrado (()) está equilibrado

 def check(string): counter=0 string=string.replace(" ","") if string[0] is "(": for x in string: if x is "(": counter=counter+1 elif x is ")": counter=counter-1 if counter1 is 0: print("Balanced") else: print("Unbalanced") else: print ("Unbalanced") 

Así que esto funciona, pero ¿cómo resuelvo este problema con la recursión? Estoy tratando de pensar cómo puedo hacer que una variable disminuya cada vez que lo llamo recursivamente y una vez que sea 0, deténgase.

Una conversión directa y equivalente del algoritmo se vería así:

 def check(string, counter=0): if not string: return "Balanced" if counter == 0 else "Unbalanced" elif counter < 0: return "Unbalanced" elif string[0] == "(": return check(string[1:], counter+1) elif string[0] == ")": return check(string[1:], counter-1) else: return check(string[1:], counter) 

Úsalo así:

 check("(())") => "Balanced" check(")(") => "Unbalanced" 

Tenga en cuenta que el algoritmo anterior tiene en cuenta los casos en que el paréntesis de cierre aparece antes del paréntesis de apertura correspondiente, gracias a la condición de elif counter < 0 , por lo que se soluciona un problema que estaba presente en el código original.

 >>> def check(mystr, barometer=0): ... if not mystr: ... return barometer ... elif mystr[0] == "(": ... return check(mystr[1:], barometer+1) ... elif mystr[0] == ")": ... return check(mystr[1:], barometer-1) ... else: ... return check(mystr[1:], barometer) ... >>> for s in ["()", "(()", "(())", "()()"]: print(s, check(s)) ... () 0 (() 1 (()) 0 ()() 0 

0 significa que estás bien equilibrado. Cualquier otra cosa significa que no estás equilibrado