2017-12-11 2 views
1

Also versuche ich in Prolog herauszufinden, wie man eine Eingabe nimmt und ob es eine perfekte Zahl ist oder nicht. Momentan bin ich in der Nähe, kann aber nicht herausfinden, warum es nicht so funktioniert, wie ich es möchte. Ich nähere mich diesem durch Rekursion. Wenn X% N == 0 ist, dann werden N und TT (gesamt) zu TT1 addiert. N um eins verringert wird und die Funktion wird rekursiv aufgerufen werden, bis er 1 erreicht, dann wird die Summe auf die Eingangsnummer X verglichen werden Mein Code ist:Perfekte Nummer in Prolog

factors(X,N,TT) :- 
    ( 0 is X mod N -> TT1 is N + TT), 
    TT = TT1, 
    ( N > 1 -> N1 is N-1, factors(X, N1, TT1) 
    ; TT1 = X 
    ). 

perfect(X) :- 
    factors(X, X-1, 0). 

Derzeit ist es der Rückkehr, dass alle Eingaben falsch sind . Ich hoffe, das ist nicht inkorrekt und muss nur optimiert werden. Es sieht aus wie in `Faktoren/3`,` TT` ist bereits gebunden (über den Anruf)

Prost

+0

hilft. Wenn Sie dann "TT1 ist N + TT" berechnen und dann auf Vereinheitlichung prüfen, "TT = TT1", schlägt diese Vereinigung fehl, da "TT" und "TT1" wahrscheinlich an unterschiedliche Werte gebunden sind. Meinst du "TT = TT1" als Alternative zu "TT1 ist N + TT"? In diesem Fall muss Ihr '->/2' Ausdruck und der folgende Unification-Check" Tweaking "sein. – lurker

+2

Ist [dein Freund] (https://stackoverflow.com/questions/47742914/prolog-perfect-number-generation) in derselben Klasse? [Vielleicht dieser] (https://stackoverflow.com/questions/47744880/cant-understand-prolog-line-of-code) auch? –

+2

@lurker: Bereite dich vor, bald wird der Mjölnir dir gehören. – false

Antwort

0

Hier ein Lösungen, hoffen, dass es

factors(_,N,N,_). 
factors(X,N,NT,Sum):- 
    N < NT, 
    ( 0 is X mod N -> 
     Sum1 = Sum + N 
    ; Sum1 = Sum), 
    N1 is N + 1, 
    factors(X,N1,NT,Sum1). 

perfect(X):- 
    XT is X/2 + 1, 
    factors(X,1,XT,0).