Warum gibt meine rekursive Funktion keine?

Ich versuche derzeit, meinen Kopf zu umgehen, um Python zu lernen, und ich bin ein bisschen wie ein Stall auf rekursive Funktionen gekommen. In Think Python ist eine der Übungen eine Funktion zu schreiben, die bestimmt, ob die Zahl a eine Macht der Zahl b ist, mit folgender Definition:

"Eine Zahl, a, ist eine Macht von b, wenn es durch b teilbar ist und a / b eine Macht von b ist. Schreiben Sie eine Funktion namens is_power, die Parameter a und b übernimmt und kehrt True zurück, wenn a eine Macht von b ist."

Der aktuelle Stand meiner Funktion ist:

def isPower(a,b): return a % b == 0 and (a/b) % b == 0 print isPower(num1,num2) 

Wie es ist, ergibt sich das Ergebnis, das ich erwarte. Allerdings konzentriert sich das Kapitel auf das Schreiben von rekursiven Funktionen, um Redundanz zu reduzieren, und ich bin mir nicht ganz sicher, wie ich das Finale "(a / b)% b == 0" in eine Rekursion umwandeln kann. Ich habe versucht:

 def isPower(a,b): if a % b != 0: return False elif isPower((a/b),b): return True 

Aber das kommt einfach nicht zurück.

Was ist der richtige Weg, um diese Funktion wiederzuerlangen?

7 Solutions collect form web for “Warum gibt meine rekursive Funktion keine?”

Sie vergessen einen Basisfall, wenn ein == 1:

 def isPower(a,b): if a == 1: return True if a % b != 0: return False elif isPower((a/b),b): return True else return False 

Allerdings hat dies einige andere Probleme – wenn a ist 0 dann wird es nie beenden und wenn b ist 0 dann erhalten Sie eine divide-by-zero.

Hier ist eine ausführliche Lösung, die, soweit ich sagen kann, für alle Integer-Kombinationen arbeiten wird:

 def isPower(a,b): if a == 0 or b == 0: return False def realIsPower(a, b): if a == 1: return True elif a%b != 0: return False elif realIsPower((a/b), b): return True else: return False return realIsPower(a, b) 

EDIT: Mein Code funktionierte nicht für Fälle, in denen sowohl a als auch b negativ sind. Ich vergesse jetzt ihre absoluten Werte.

EDIT2: Dumm mich, x ^ 0 == 1, also sollte ein == 1 IMMER zurückkehren. Das bedeutet auch, dass ich vor der Rekursion nicht mit b vergleichen muss. Danke @Javier.

Du brauchst einen zusätzlichen Fall, denn wenn beide Bedingungen false zurückgeben

 def isPower(a,b): if a % b != 0: return False elif isPower((a/b),b): return True else return False 
 def isPower (a,b): return a==1 or (a!=0 and b!=0 and b!=1 and isPower((a/b),b)) 

Hier ist mein Code. Von dem, was ich getestet habe, funktioniert es:

 def ispower(a, b): if b == 1 or b == 0: return False if b <= 0 or a <= 0: return False if a % b == 0: if ((a / b) / b) == 1: return True else: return ispower(a / b, b) else: return False print ispower(-10, 2) 

Versuche dies,

 def ispower(a,b): if b==a: return True elif a<b: return False else: return ispower(a*1.0/b, b) 
 def is_power (a, b): if a == 1: return True if a == 0 and b == 0: return True if a == 0 or b == 0: return False if a%b != 0: return False elif is_power ((a/b), b): return True 

Hier ist meine Antwort, es ist ein bisschen sauberer:

 def is_power(a, b): if a == 1: return True if a == 0 or b == 0: return False if a % b == 0 and is_power(a/b, b): return True else: return False 
  • Finde alle Index mit Rekursion
  • Python rekursiv anhängen Liste Funktion
  • Rekursiver Generator zum Abflachen von verschachtelten Listen
  • Python Recursive Funktion für Collatz Conjecture
  • Integer auf Basis-x-System mit Rekursion in Python
  • Python Recursive Funktion fehlende Ergebnisse
  • Refactoring rekursive "Vorkommen von" Funktion
  • Notwendigkeit, Pyramiden-Dreieck auf Python neu zu erstellen
  • Refactoring zur Beseitigung der globalen Variablen in rekursiver Funktion
  • Rekursionsfunktion in Python
  • Python leer dict nicht durch Verweis übergeben?
  • Python ist die beste Programmiersprache der Welt.