Hackerboard WikiHaboBlog

[HaBo]

 
Programmieraufgaben Hier wird regelmäßig eine neue Programmieraufgabe gestellt, die dann gelöst werden soll und in Zusammenarbeit mit den Moderatoren auch besprochen werden kann.

Treppensteigen

Diskussion: Treppensteigen im Forum Programmieraufgaben, in der Kategorie Code Kitchen; Meine Java Lösung mit Rekursion Kern ist die doIt Methode. Code: import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; public ...

Antwort
Alt 25.06.08, 22:08   #16 (permalink)
 
Registriert seit: 21.04.08
Ook! Leistung: Facit NTK
Likes: 0
Standard


Meine Java Lösung mit Rekursion
Kern ist die doIt Methode.

Code:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class StairsClimbing {

	public static void main(String[] args) {
		Solver sv = new StairsClimbing().new Solver(4);
		System.out.println("Anzahl Möglichkeiten: "+ sv.getSolutionCount());
		System.out.println("Lösungen: "+ sv.getSolutions());
	}

	class Solver {

		private List<String> solutions = null;

		public Solver(int stairsCount) {
			this.solutions = new ArrayList<String>();
			this.doIt(stairsCount, prepareString(stairsCount));
		}

		private String prepareString(int stairsCount) {
			char[] array = new char[stairsCount];
			Arrays.fill(array, '1');
			return String.valueOf(array);
		}

		private void doIt(int pos, String stairs) {
			for(int i=pos; i>1; i--)
				doIt(i-2, stairs.substring(0,i-2) +"2"+ stairs.substring(i));
			solutions.add(stairs);
		}

		public String getSolutions() {
			Collections.reverse(solutions);
			String resultString = Arrays.toString(solutions.toArray());
			return resultString.substring(1, resultString.length()-1);
		}
		
		public int getSolutionCount() {
			return solutions.size();
		}

	}

}
Die Ausgabe für die Stufenanzahl 4 sieht dann so aus:
Code:
Anzahl Möglichkeiten: 5
Lösungen: 1111, 211, 121, 112, 22
Ook! ist offline   Mit Zitat antworten
Alt 04.01.09, 15:01   #17 (permalink)
 
Benutzerbild von Stein
 
Registriert seit: 10.10.05
Stein Leistung: Facit NTK
Stein eine Nachricht über ICQ schicken
Likes: 0
Standard

Python rekurisv
[SPOILER]
Code:
def step(n,steps_before):
    global stufen
    if n + 1 <= stufen:
        step(n + 1, steps_before + str(1))
    if n + 2 <= stufen:
        step(n + 2, steps_before + str(2))
    if n == stufen:
        global counter
        print steps_before
        counter += 1

counter = 0
stufen = int(raw_input("Wieviele Stufen gibt es?"))
step(0,"")
print "Ways: " + str(counter)
[/SPOILER]

und weil ich Langeweile habe:
Scheme
[Spoiler]
Code:
(define (treppe n stufen)
  (cond
    ((> stufen n) (+ (treppe (+ n 1) stufen) (treppe (+ n 2) stufen)))
    ((= stufen n) 1)
    ((< stufen n) 0)))
[/spoiler]

15 Stufen bleiben unter einer Sekunde
Stein ist offline   Mit Zitat antworten
Alt 04.04.09, 23:46   #18 (permalink)
 
Registriert seit: 16.11.06
Virus Leistung: Facit NTK
Virus eine Nachricht über ICQ schicken
Likes: 0
Standard C++

Hier mal meine Lösung in C++, wenn jemand lust hat kann er mir ya mal schreiben was ich verbessern könnte.

Code:
#include <iostream>

using namespace std;
int treppe( int stufe );
    int stufen;
    char* pointer;
    int counte;
    int moeglichkeiten;
int main( )
{
    // Eingabe:
    cout << "Treppenstufen: ";
    cin >> stufen;
    treppe( stufen );
    cout << "Moeglichkeiten: " << moeglichkeiten;
    delete [] pointer;
    return 0;
}
int treppe( int stufe ) {
    counte++;
    if ( stufe == stufen ) { // Am Anfang wird der char array für die lösung erstellt
    pointer = new char[stufen];
    }
    if ( stufe-2>-1 ) { // Wenn die stufenanzahl -2 nicht ins minus geht rekursion
        pointer[counte] = '2';
        counte = treppe(stufe-2); 
    }
    if ( stufe-1>-1 ) { // Wenn die Stufenzahl -1 nicht ins minus geht: rekursion
        pointer[counte] = '1';
        counte = treppe(stufe-1);
    }
    if ( stufe < 1 ) { // Wenn eine Lösung gefunden wurde ausgeben.
        for( int i=1; i < counte; i++) {
            cout << pointer[i] << " ";
        }
        cout << endl;
        moeglichkeiten++;
    }
        return counte-1; // Einen Schritt zurück gehen
}
Virus ist offline   Mit Zitat antworten
Alt 05.04.09, 12:17   #19 (permalink)
Senior Member
 
Registriert seit: 03.09.05
Lesco Leistung: Facit NTK
Likes: 0
Standard

Für die reine Berechnung der Anzahl:
Man kann das Ganze auch als ein kombinatorisches Problem auffassen: Für k Zweier-Schritte, gibt es genau (n - 2*k + k) über k Möglichkeiten, diese anzuordnen. Dies summiert man dann für 0..n / 2 auf und man hat die Anzahl der Möglichkeiten:
(In Haskell: )
Code:
fac 0 = 1
fac n = product [1..n]

n `binom` k = fac n `quot` (fac k * fac (n-k))

treppe :: Integer -> Integer
treppe n = sum [(n - 2*k + k) `binom` k | k <- [0..n `quot` 2]]
Dabei sieht man auch, dass es, wie oben erwähnt, sich um die Folge der Fibonacci-Zahlen handelt, daher als Einzeiler/Zweizeiler(mit Absicht unverständlich):
Code:
import Control.Monad.Fix
treppe n = fix ((1:) . scanl (+) 1) !! n

Geändert von Lesco (19.11.09 um 13:56 Uhr)
Lesco ist offline   Mit Zitat antworten
Alt 17.11.09, 21:19   #20 (permalink)
 
Benutzerbild von Stein
 
Registriert seit: 10.10.05
Stein Leistung: Facit NTK
Stein eine Nachricht über ICQ schicken
Likes: 0
Standard

Für ein ähnliches Problem(Projekt Euler 31) hab ich einige Optimierungen vernehmen müssen die ganz gut passen. Dabei nimmt man einfach an dass sie die neuen Möglichkeiten aus der der Stufe vorher und der 2 voher zusammen setzten.(Im Grunde Fibonacci). Bis 2000 geht das Programm fast ohne Verzögerung:
Code:
                                  
def moeglichkeiten(n):
    ergebnis = 0
    global muenzen
    for    muenze in muenzen:
    if muenze == n:
            ergebnis +=    1
    if muenze < n:
            global posibilities
            ergebnis += posibilities[n - muenze]
    return ergebnis
posibilities = []
posibilities.append(0)
muenzen    = [1,2]#,5,10,20,50,100,200]                                            
for i in range(1,2001):
    posibilities.append(moeglichkeiten(i))
    print str(i) + ': '+ str(posibilities[i])
Leider passt es aber nicht auf das Ursprungsproblem
Stein ist offline   Mit Zitat antworten
Alt 18.11.09, 19:10   #21 (permalink)
 
Registriert seit: 31.03.08
MrSpider Leistung: Facit NTK
Likes: 0
Standard

Das ganze in Haskell
Code:
treppe :: Integer -> [[Integer]]
treppe 0 = [[]]
treppe 1 = [[1]]
treppe n = [a:b | a <- [1,2], b <- treppe (n - a)]
-> List Comprehension <3

Code:
*Main> length (treppe 20)
10946
*Main> length (treppe 25)
121393
*Main> length (treppe 30)
1346269
*Main> treppe 4
[[1,1,1,1],[1,1,2],[1,2,1],[2,1,1],[2,2]]
25 geht noch recht schnell (~ 3s)
MrSpider ist offline   Mit Zitat antworten
Antwort
   

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » Programmieraufgaben » Treppensteigen
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus



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