zerogravity Geschrieben 23. April 2012 Geschrieben 23. April 2012 Hallo, da ich nicht so wirklich fit bin in Sachen Algorithmen, wollte ich hier mal um Hilfe bitten um folgenden Algorithmus zu lösen: Was wären hier die Werte von X sowie des Vektors v? v:=[1,2,3,4,5,6,7,8] for((x:=1);(x<8) do v[x]:=v[x]*2; x:=x+2 enddo); Und als Vorschlag bräuchte ich einen algorithmus der die Fakultät eines ganzen positiven sowie Null-Wertes rechnet, n!. Danke Zitieren
Klotzkopp Geschrieben 23. April 2012 Geschrieben 23. April 2012 Was wären hier die Werte von X sowie des Vektors v?Spiel es mit Bleistift und Papier durch. Und als Vorschlag bräuchte ich einen algorithmus der die Fakultät eines ganzen positiven sowie Null-Wertes rechnet, n!.Ein erster Ansatz: Versuche zu formulieren, wie du als Mensch die Fakultät berechnen würdest. Zitieren
zerogravity Geschrieben 23. April 2012 Autor Geschrieben 23. April 2012 Hi, also die Fakultät mit der Hand rechnen wäre nicht das Problem; so gesehn ist es ja eine rekursive Funktion mit n*(n-1) aber ich habe meine Probleme damit, dies so als algorithmus hinzuschreiben. Und bei dem ersten, wäre meine Vermutung, dass folgendes Resultat raus kommt: x=3,4,5,6,7,8,9 und der Vektor v:=[2,4,6,8,10,12,14,16] ? ^^ Zitieren
Klotzkopp Geschrieben 23. April 2012 Geschrieben 23. April 2012 also die Fakultät mit der Hand rechnen wäre nicht das ProblemDann beschreib doch einfach mal die Vorgehensweise. Einfach in normaler menschlicher Sprache, keine Fachbegriffe. Und bei dem ersten, wäre meine Vermutung, dass folgendes Resultat raus kommt:Vermutung? Du sollst nicht vermuten, du sollst das Programm auf dem Papier durchspielen. Da steht am Ende ein Ergebnis, keine Vermutung. Raten wird dich nicht weiterbringen. Zitieren
lilith2k3 Geschrieben 23. April 2012 Geschrieben 23. April 2012 fac(x) { var ergebnis=1; if (x>1) ergebnis = x*fac(x-1); return ergebnis; } [/php] Die erste Aufgabe ist nicht korrekt beantwortet. Die Zählervariable sieht wie folgt aus: Initial ist es 1 dann 3 dann 5 dann 7 dann >8 Also werden die Elemente v[x] ; mit x € {1, 3, 5, 7} verändert. Aus [1, 2, 3, 4, 5, 6, 7, 8] wird [2, 2, 6, 4, 10, 6, 14, 8]. Zitieren
zerogravity Geschrieben 23. April 2012 Autor Geschrieben 23. April 2012 Dann beschreib doch einfach mal die Vorgehensweise. Einfach in normaler menschlicher Sprache, keine Fachbegriffe. Vermutung? Du sollst nicht vermuten, du sollst das Programm auf dem Papier durchspielen. Da steht am Ende ein Ergebnis, keine Vermutung. Raten wird dich nicht weiterbringen. Falls n=0, Resultat ist 1; Solange n>1, rechne mit derselben Funktion n*(n-1) wenn man denn die Logik von dem Programm verstehen würde, wäre es ja auch einfach dies auf dem Papier durchzuspielen^^ Das Resultat von lilith2k3 kommt mir schon spanisch vor (also kann sein, dass es korrekt ist, aber ich verstehs nicht) solange x zwischen 1 inklusive und exklusive 8 ist, wird x+2 gerechnet also 3,4,5,6,7,8,9 daher meine "Vermutung" und der Wert des Vektors wird *2 multipliziert. Zitieren
Klotzkopp Geschrieben 23. April 2012 Geschrieben 23. April 2012 Falls n=0, Resultat ist 1; Solange n>1, rechne mit derselben Funktion n*(n-1)Für n = 4 (beispielsweise) rechne ich also 4 * 3, macht 12. Danach ist n immer noch 4, also rechne ich nochmal 4 *3, und nochmal und nochmal und nochmal. Das kommt zu keinem Ende. Ich traue dir zu, dass du eine Fakultät korrekt ausrechnen kannst. Also gibt diese Beschreibung nicht wieder, wie du dabei vorgehst. wenn man denn die Logik von dem Programm verstehen würde, wäre es ja auch einfach dies auf dem Papier durchzuspielen^^Du brauchst die Logik nicht zu verstehen, um das Programm durchzuspielen, du musst ja nur stumpf Anweisungen befolgen. Du sollst das durchspielen, damit du die Logik verstehst. Das Resultat von lilith2k3 kommt mir schon spanisch vor (also kann sein, dass es korrekt ist, aber ich verstehs nicht)Es ist korrekt, auch wenn ich es nicht gut finde, dass er vorsagt solange x zwischen 1 inklusive und exklusive 8 ist, wird x+2 gerechnet also 3,4,5,6,7,8,9Erklär mir doch mal, wie bei dir x jemals 4 wird. Zitieren
zerogravity Geschrieben 24. April 2012 Autor Geschrieben 24. April 2012 (bearbeitet) Für n = 4 (beispielsweise) rechne ich also 4 * 3, macht 12. Danach ist n immer noch 4, also rechne ich nochmal 4 *3, und nochmal und nochmal und nochmal. Das kommt zu keinem Ende. Ich traue dir zu, dass du eine Fakultät korrekt ausrechnen kannst. Also gibt diese Beschreibung nicht wieder, wie du dabei vorgehst. Du brauchst die Logik nicht zu verstehen, um das Programm durchzuspielen, du musst ja nur stumpf Anweisungen befolgen. Du sollst das durchspielen, damit du die Logik verstehst. Es ist korrekt, auch wenn ich es nicht gut finde, dass er vorsagt Erklär mir doch mal, wie bei dir x jemals 4 wird. Hm ja also 4! wäre ja 4*3*2*1 n wäre 4 dann rechne ich resultat=4*(4-1), danach resultat*(4-1-1) bis halt (4-1-1-1) Erklär mir doch mal, wie bei dir x jemals 4 wird. ich versteh's so: x geht ja von 1 bis exklusive 8; und x:=x+2 also alle x von 1 bis 7 wird 2 addiert. Wenn du mir sagst, den code einfach stumpf durchzugehn...das kommt dabei raus :/ ABer mir ist der Zusammenhang Vektor/x nicht klar glaub ich mal. Danke fac(x) { var ergebnis=1; if (x>1) ergebnis = x*fac(x-1); return ergebnis; } da hätte ich noch eine Frage. Geht das so mit if? Sollte dies keine for oder while Schleife sein? Bearbeitet 24. April 2012 von zerogravity Zitieren
Klotzkopp Geschrieben 24. April 2012 Geschrieben 24. April 2012 n wäre 4 dann rechne ich resultat=4*(4-1), danach resultat*(4-1-1) bis halt (4-1-1-1)Schon besser. Und jetzt beschreib die Vorgehensweise im allgemeinen Fall. Wenn du mir sagst, den code einfach stumpf durchzugehn...das kommt dabei raus :/Ich glaube, dir ist nicht klar, was mit "Durchgehen" gemeint ist. Du sollst den Anfangswert jeder Variablen aufschreiben, und dann das Programm Anweisung für Anweisung durchgehen, und die Änderungen der Variablenwerte aufschreiben. ABer mir ist der Zusammenhang Vektor/x nicht klar glaub ich mal.Es gibt keinen Zusammenhang. Die Variablen sind unabhängig. Du hast einen Vektor v mit 8 Zahlen, und eine weitere Zahl x. So sieht's zu Beginn aus (alles unter der Annahme, dass der Index des Vektors 1-basiert ist): x v[1] v[2] v[3] v[4] v[5] v[6] v[7] v[8] 1 1 2 3 4 5 6 7 8[/code] Jetzt gehst du das Programm durch bis zur ersten Anweisung, die etwas verändert. Das ist v[x]:=v[x]*2. x ist 1, also multiplizierst du v[1] mit 2: [code]x v[1] v[2] v[3] v[4] v[5] v[6] v[7] v[8] 1 [COLOR="red"]2[/COLOR] 2 3 4 5 6 7 8 In der nächsten Anweisung wird x um 2 erhöht: x v[1] v[2] v[3] v[4] v[5] v[6] v[7] v[8] [COLOR="red"]3[/COLOR] 2 2 3 4 5 6 7 8[/code] Dann wird die Schleifenbedingung geprüft. x < 8 ist wahr, also geht es wieder von vorn los: v[x] wird verdoppelt: [code]x v[1] v[2] v[3] v[4] v[5] v[6] v[7] v[8] 3 2 2 [COLOR="red"]6[/COLOR] 4 5 6 7 8 usw. Zitieren
zerogravity Geschrieben 24. April 2012 Autor Geschrieben 24. April 2012 Guten Abend, danke für die Antworten! jetzt hab ich den Alg verstanden und es ist wirklich logisch. ich war da irgendwie auf einem Holzweg; habe das komplett anders interpretiert :/ Das hat mir jetzt echt geholfen und wegen der Fakultät, da ist es ja so, dass dieser rekursiv augerufen wird solange x>=1. aber es muss ja zu Beginn noch ein if x==0 hin dann ist das Resultat 1. if (x == 0) return 1; else return x * fac(x-1); Zitieren
lilith2k3 Geschrieben 25. April 2012 Geschrieben 25. April 2012 Den Schritt kannst Du Dir schenken. Prüfe einfach ob x>1 ist, ansonsten gebe 1 zurück. Dann hast Du die Überprüfung mit 0 gespart! Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.