Einzelnen Beitrag anzeigen
Alt 03.06.08, 21:25   #14 (permalink)
CDW
Moderator
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 198
Standard

Wozu muss man sich irgendwelche Algorithmen überlegen? Der Computer ist doch zum Nachdenken da, man muss ihm nur das Problem beschreiben
Prolog gut kommentiert   

Code:
schritt(1).  %es gibt zwei Arten von Schritten.
schritt(2).
%Problem des Treppensteigens ist gelöst
%sofern man alle Stufen überwunden hat (wer hätte es gedacht ;) )
loesung(Stufen_gesamt,Zurueckgelegt):-
	Stufen_gesamt =:= Zurueckgelegt.
%sonst:
loesung(Stufen_gesamt,Zurueckgelegt):-
	Stufen_gesamt>Zurueckgelegt,  %hat man noch nicht alle Stufen zurückgelegt,
	schritt(Schrittweite),  %gibt es einen Schritt, der uns vielleicht 
	loesung(Stufen_gesamt,Zurueckgelegt+Schrittweite), %in Lösungsnähe bringt	
	write(Schrittweite),write(' '). %wenn es so war, 
        %sollte man den Schritt ausgeben

%gehört nicht mehr zur Lösung, sondern dient eher bequemeren Ausgabe
loesungen(Stufen_gesamt, Anzahl):-
	findall(X,(loesung(Stufen_gesamt,0),nl),Ergebnis),
	length(Ergebnis,Anzahl).

oder Prolog, kommentarlos und kompakt   

Code:
schritt(1). 
schritt(2).

loesung(St,Zu):- St is Zu.

loesung(St,Zu):- St>Zu, 	
       schritt(Sw),loesung(St,Zu+Sw),write(Sw),write(' ').

loesungen(Stufen_gesamt, Anzahl):-
	findall(X,(loesung(Stufen_gesamt,0),nl),Ergebnis),
	length(Ergebnis,Anzahl).


wobei "findall" keine magische und geheime Handlung darstellt, sondern dazu dient alle Lösungen aufeinmal auszugeben (normalerweise liefert Prolog immer nur eine und man muss explizit bestätigen, wenn man eine weitere haben möchte).

Ausgabe   

Code:
?- loesungen(5,Anzahl).
1 1 1 1 1 
2 1 1 1 
1 2 1 1 
1 1 2 1 
2 2 1 
1 1 1 2 
2 1 2 
1 2 2 
Anzahl = 8.

?- loesungen(4,Anzahl).
1 1 1 1 
2 1 1 
1 2 1 
1 1 2 
2 2 
Anzahl = 5.

Wobei man sich auch eine Beschreibung als Permutation der Schritte vorstellen könnte (aber solange mache ich Prolog noch nicht).
__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61