probleme mit code |
|
z.b. bei fakultaet(4) heisst es zuerst:
4 * fac(4-1) //
wird da zuerst 4*3 gerechnet und 12 intern gespeichert usw. , oder heisst es dann gleich wieder 3 * fac(3-1) , da gleich wieder die funktion aufgerufen wird, also ist die 4 garnicht mehr vorhanden usw am ende müsste halt nur 1 rauskommen !!
was wird da vor was zuerst gemacht , ich weiss zwar jetzt wie man das rechnet aber ich verstehe den ablauf nicht ganz !!
|
|
03.07.2008 13:42 |
|
|
|
das letztere. und natürlich ist die 4 noch vorhanden, nur wird nicht sofort mit gerechnet.
und die 3 kann nicht direkt zurückgegeben werden, da der wert zum rückgeben noch garnicht feststeht. erst muss halt noch 3 * fac(3-1) aufgelöst werden, und dann noch der reeeest.
|
|
03.07.2008 14:26 |
|
|
|
also heisst es intern und der browser sieht das so:
4 * fac(4-1) 3 * fac(3-1) 2 * fac(2-1) 1 = return 1
a) wird da erst 4*3 berechnet und dann die funktion wieder aufgerufen ?
ich werde einfach noch nicht schalu daraus !
b)wie wird das intern berechnet , wenn man das kurz erklären könnte , was da passiert genau nacheinander und wie der browser das sieht ?
ich frage das alles um es auch wirklich zu verstehen , auch andere schwerere reku. funktionen .
danke
|
|
03.07.2008 15:10 |
|
|
|
Zitat: |
Original von DarkSquirrel
um rekursion zu verstehen, müssen sie zunächst rekursion verstehen ... |
|
um es etwas anders als im buch da auszudrücken...
fac(5) ... programmablauf:
es wird ein neuer funktionsaufruf für fac(5) erzeugt, und die anweisungen in der funktionsdefinition werden ausgeführt ...
ANFANG fac(5) funktionsaufruf
5 ist größer als 1, folglich greift das return 1 nicht...
es wird also 5* fac(4) zurückgegeben ....
das ist allerdings nicht möglich, da das ergebnis von fac(4) nicht vorliegt, und vor der rückgabe erst berechnet werden muss...
es wird ein neuer funktionsaufruf für fac(4) erzeugt, und die anweisungen in der funktionsdefinition werden ausgeführt ...
ANFANG fac(4) funktionsaufruf
4 ist größer als 1, folglich greift das return 1 nicht...
es wird also 4* fac(3) zurückgegeben ....
das ist allerdings nicht möglich, da das ergebnis von fac(3) nicht vorliegt, und vor der rückgabe erst berechnet werden muss...
es wird ein neuer funktionsaufruf für fac(3) erzeugt, und die anweisungen in der funktionsdefinition werden ausgeführt ...
ANFANG fac(3) funktionsaufruf
3 ist größer als 1, folglich greift das return 1 nicht...
es wird also 3* fac(2) zurückgegeben ....
das ist allerdings nicht möglich, da das ergebnis von fac(2) nicht vorliegt, und vor der rückgabe erst berechnet werden muss...
es wird ein neuer funktionsaufruf für fac(2) erzeugt, und die anweisungen in der funktionsdefinition werden ausgeführt ...
ANFANG fac(2) funktionsaufruf
2 ist größer als 1, folglich greift das return 1 nicht...
es wird also 2* fac(1) zurückgegeben ....
das ist allerdings nicht möglich, da das ergebnis von fac(1) nicht vorliegt, und vor der rückgabe erst berechnet werden muss...
es wird ein neuer funktionsaufruf für fac(1) erzeugt, und die anweisungen in der funktionsdefinition werden ausgeführt ...
ANFANG fac(1) funktionsaufruf
1 ist kleiner gleich 1, folglich greift das return 1 ...
es wird also 1 zurückgegeben ....
ENDE fac(1) funktionsaufruf
nun liegt das ergebnis von fac(1) vor, und 2*fac(1) kann zurückgegeben werden
ENDE fac(2) funktionsaufruf
nun liegt das ergebnis von fac(2) vor, und 3*fac(2) kann zurückgegeben werden
ENDE fac(3) funktionsaufruf
nun liegt das ergebnis von fac(3) vor, und 4*fac(3) kann zurückgegeben werden
ENDE fac(4) funktionsaufruf
nun liegt das ergebnis von fac(4) vor, und 5*fac(4) kann zurückgegeben werden
ENDE fac(5) funktionsaufruf
edit:
zu beachten ist, dass vor dem aufruf der nächsten rekursiven funktion die aufrufende funktion NICHT beendet ist ... sie wird fortgesetzt, NACHDEM der aufruf mit dem ergebnis zurück kommt
__________________ Gräten auf dem Sofakissen wird man wohl entfernen müssen.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von DarkSquirrel: 03.07.2008 17:37.
|
|
03.07.2008 17:34 |
|
|
|
ok, danke erstmal.
a) das :
with(frames[1].document.forms[0]) {
// Greife hier direkt auf Formularelemente zu. Beispiel:
name.value = "";
adressfeld.value = "";
email.value = "";
}
kann man auch so schreiben :
var formular = frames[1].document.forms[0];
form.name.value = "";
form.adressfeld.value = "";
form.email.value = "";
was hat die variable formular mit den drei unteren zeilen zu tun ?
müsste es nicht heissen formular.name.value usw. statt form.name.value ?
|
|
04.07.2008 14:08 |
|
|
|
sowas kann man sich eigentlich immer selbst am schnellsten beantworten... einfach testen.
trotzdem: ich glaubs auch.
ich hätte formular in form umbenannt.
|
|
04.07.2008 14:43 |
|
|
|
nochmal kurz zur rekursion:
a) ..das heisst ,dass man erst 5 schritte nach vorne macht und dann wieder 5 zurück , deiner erklärung nach ?
b) wie kann man denn etwas mit fac(4) multiplizieren ? geht doch nur mit zahlen ?
|
|
04.07.2008 15:25 |
|
|
|
1. um es mal an einem beispiel aus der realen welt zu verdeutlichen.
vorgang: 5 steine aufeinander maurern...
baue_turm_aus_steinen(5); bzw. btas(5);
die funktion setzt, soweit sie kann, einen stein inne luft. kann sie es nicht, ruft sie die funktion auf, die unter ihr ein stein setzt, damit es irgendwann mal möglich wird.
die funktion/vorgang will als erstes einen stein inner luft (der funktion fehlen vier steine) setzen... das geht natürlich nicht. also ruft sie btas(4) auf. das wäre immer noch inner luft. also ruft btas(4) btas(3) auf, welche btas(2) aufruft, welche btas(1) aufruft und WhAt? wir haben den ersten stein setzen können, da wir nun festen boden unter uns haben...
auf einmal kann btas(2) beenden, welche natürlich den zweiten stein setzt. dadurch kann sich btas(3) beenden, dadurch wieder btas(4) und letzendlich kann sich auch btas(5) beenden... der turm ist gebaut.
2. fac(4) gibt den sogenannten rückgabewert zurück...
function asdfg(x) {
return 2*x;
}
asdfg(10) gibt 20 zurück, womit dann gerechnet werden würde. ich dachte soweit wärste schon.
|
|
04.07.2008 16:52 |
|
|
|
fac(4) ist streng genommen ein ausdruck...
stell dir eine variable vor, von der du nur lesen kannst...
die funktion wird ausgewertet, und das was die funktion mit return zurückgibt, ist der wert der variablen...
wenn dort etwas steht wie:
fkt(blah)
{
...
...
...
return 4*fkt2(foo);
}
dann kann das return erst ausgeführt werden, wenn der gesammte ausdruck dahinter bekannt ist ...
dafür muss dann fkt2 ausgeführt werden: das was fkt2 dann als return liefert, wird als wert von fkt2 angesehen, und der ausdruck entsprechend ausgewertet ...
erst danach kann fkt ein ergebnis mitels return zurück liefern ...
daher sind die funktionsaufrufe bei einer rekursiven funktion geschachtelt ... erst wenn die letzte funktion ein ergebnis liefert, kann die vorletzte eines liefern ...etc.
wenn du es mathematisch ausgedrückt haben willst sieht das etwa so aus:
FAK(5)= 5 * FAC(4)
FAK(4)= 4 * FAC(3)
FAC(3)= 3 * FAC(2)
FAC(2)= 2 * FAC(1)
FAC(1)= 1
um nun einen zahlenwert zu bekommen, würdest du die variablen zu einer formel zusammensetzen ... FAC(5)= 5*4*3*2*1
der rechner kann das nicht, er hat nur eine funktion, die FAC(x) auf FAC(x-1) zurückführt daher kann er schrittweise berechnen:
er soll FAC(5)berechnen ... fehlt ihm das ergebnis von FAC(4) zu ... berechnet er also FAC(4) ... fehlt ihm das ergebnis von FAC(3) ...
__________________ Gräten auf dem Sofakissen wird man wohl entfernen müssen.
|
|
04.07.2008 16:59 |
|
|
|
ok ,danke, werde mir das alles mal genau anschauen.
ich habe noch etwas :
zahlen = {x:1,y:2,z:3,nam:"hallo"};
function zeigeEigenschaftsnamen(obj) {
var namen = " ";
for(var name in obj) namen += name +"\n";
alert(namen);
}
zeigeEigenschaftsnamen(zahlen);
das kleine problem ist eigentlich wieder dasselbe ( was "hinter den kulissen passiert").
namen += name
nach mir müsste es so heissen:
namen = " " + x = "x"
namen = "x" + y = ??
jetzt verstehe ich das irgendwie nicht , mit alert wird
x
y
z
nam
ausgegeben ?
|
|
11.07.2008 16:31 |
|
|
|
" " += "x"+"\n" ------> " x\n"
" x\n" += "y"+"\n" ------> " x\ny\n"
...
wobei \n für newline also einen zeilenumbruch steht...
ja, das gibt das programm aus ...
aber warum testest du das nicht einfach?
__________________ Gräten auf dem Sofakissen wird man wohl entfernen müssen.
|
|
11.07.2008 17:42 |
|
|
|
ich habe getestet was raus kommt , aber wie das ensteht("hinter den kulissen") weiss ich nicht genau.
das heisst , die ganze schleife wird zuerst bis zum ende ausgeführt und dann alert ausgeführt, ok soweit.
und nach jedem durchlauf speichert die schleife intern jedes ergebnis, richtig ?
das ist es was mich so iritiert !
|
|
12.07.2008 12:44 |
|
|
|
ist das richtig , was ich im vorletzten post geschrieben habe ?
|
|
14.07.2008 11:15 |
|
|
|
for(var name in obj) namen += name +"\n";
Zitat: |
und nach jedem durchlauf speichert die schleife intern jedes ergebnis
|
|
ich weiß nicht, was du damit meinst.
die schleife geht einfach durch obj und packt den jeweiligen wert des elementes in name. in der schleife wird der wert nur an namen angehangen.
das passiert auch nur so oft, wie elemente in obj sind.
|
|
14.07.2008 11:44 |
|
|
|
ich meine nach dem ersten durchlauf speichert es das ergenis = " x\n",
nach dem zweiten das ergebnis =" x\ny\n"
...
es wird ja nicht nach jedem durchlauf alert ausgegeben, das hat mich etwas iritiert.
und wenn es keine eigenschaften mehr gibt , dann kommt alert , richtig?
|
|
18.07.2008 17:28 |
|
|
|
for(i = 0;i < 2;i++){
a = prompt("geben sie einen namen ein", " ");
b = prompt("wie viele aktien"," ");
wertpapier = a ;
stueck = b ;
depot = new Object();
depot[wertpapier]= stueck ;
}
function hole_kurs(wertpapier){
ibm = 23.01
benz= 25.03
}
var wert = 0;
for (wertpapier in depot) {
wert += hole_kurs(wertpapier) * depot[wertpapier];
alert(wert)
}
a) ich möchte folgendes mit dem script :
es sollen zwei fenster erscheinen in die ich namen von aktien und die anzahl eingebe.
sie sollen zur laufzeit im object depot gespeichert werden.
unten möchte ich dann den gesamten wert meines depots berechnen .
irgendwie klappt es nicht .
das letzte alert sollte den gesamten wert ds depots ausgeben, aber es kommt nur NaN ??
|
|
23.07.2008 17:18 |
|
|
|
was erwartest du von einer funktion ohne rückgabewert?
|
|
23.07.2008 17:29 |
|
|
|
was muss ich denn da in der funktion schreiben ?
nur return am ende ?
|
|
23.07.2008 18:28 |
|
|
|
du musst das zurückgeben, was du brauchst.
und das ist hier wohl abhängig vom namen des wertpapieres.
|
|
23.07.2008 19:03 |
|
|
|
a) ich habe "return wertpapier" geschrieben , aber es kommt trotzdem nicht das ergebnis des depots !!
b) var adresse = "";
for(i = 0; i < 4; i++) {
adresse += kunde["adresse" + i] + '\n';
}
--------------------------------
var wertpapier = hole_wp_name_vom_benutzer( );
var stuecke = hole_anzahl_der_stuecke( );
depot[wertpapier] = stuecke;
--------------------------------
warum steht oben(zeile 3) "adresse" in anführungszeichen, und
unten wertpapier(zeile 3) nicht ?
c) was bedeutet das folgende:, die äusseren eckigen klammern gehören zum array, dann gibts wieder dieselben innen , und dann die 1 danach etwas in eckigen klammern usw. ??
var b = [[1,{x:1, y:2}], [2, {x:3, y:4}]];
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von pimpong: 25.07.2008 12:25.
|
|
25.07.2008 12:17 |
|
|
|
Zitat: |
Original von pimpong
a) ich habe "return wertpapier" geschrieben , aber es kommt trotzdem nicht das ergebnis des depots !!
|
|
ja, ist ja auch völlig richtig ... in diesem fall übergibst du der funktion deine variable wertpapier, die funktion setzt 2 lokale variablen, und gibt dir den wert der variablen die du ihr übergeben hast wieder zurück ... die funktion tut damit effektiv gar nichts ...
Zitat: |
b) var adresse = "";
for(i = 0; i < 4; i++) {
adresse += kunde["adresse" + i] + '\n';
}
--------------------------------
var wertpapier = hole_wp_name_vom_benutzer( );
var stuecke = hole_anzahl_der_stuecke( );
depot[wertpapier] = stuecke;
--------------------------------
warum steht oben(zeile 3) "adresse" in anführungszeichen, und
unten wertpapier(zeile 3) nicht ?
|
|
gegenfrage: was ist der unterschied zwischen "abc"+"1" und "abc1" ?
Zitat: |
c) was bedeutet das folgende:, die äusseren eckigen klammern gehören zum array, dann gibts wieder dieselben innen , und dann die 1 danach etwas in eckigen klammern usw. ??
var b = [[1,{x:1, y:2}], [2, {x:3, y:4}]]; |
|
du solltest lernen ausdrücke in JS zu verstehen ...
[1,2]
ist ein array
[[1,2],[3,4]]
ist auch ein array ... es enthält wiedrum 2 arrays ...
{x:"ich bin kein array", y:"ich bin ein objekt", z:"dass 4 string elemente besitzt", foo:"namentlich x, y, z und foo"}
...
nun schmeiß das in einen mixer und vergleiche es mit dem was du da hast ...
__________________ Gräten auf dem Sofakissen wird man wohl entfernen müssen.
|
|
25.07.2008 15:15 |
|
|
|
1) a[a[i]] = a[0]
hier ist ein array in einem anderem array , wie kann man das so schreiben a[a[i]] , die zwei arrays haben doch den gleichen namen ?
2)a) was bedeutet das "tabelle[zeile][spalte]" genau, ich weiss ein mehrdimensionales array, aber ich versteh das irgendwie nicht ganz:
b) und wie sieht es aus bei einem dreidimensionalem array usw., geht dann auch : "tabelle[zeile][spalte][ x ]" ?
c)kannst du mir wie oben kurz nur den anfang erklären und zeigen was da passiert, in den letzten zwei for-schleifen ?
d) dieser befehl tabelle[i] = new Array(10); bewirkt, dass auch da zeilen entstehen, wie kommen dann da spalten hin , woher weiss der interpreter
innerlich ,dass das spalten sind, sind doch immer zeilen , wie kann ich mir das bildlich vorstellen ?
ein bsp:
// Ein mehrdimensionales Array erzeugen
var tabelle = new Array(10); // Die 10 Zeilen der Tabelle
for(var i = 0; i < tabelle.length; i++)
tabelle[i] = new Array(10); // Jede Zeile hat 10 Spalten
// Das Array initialisieren
for(var zeile = 0; zeile < tabelle.length; zeile++) {
for(spalte = 0; spalte < tabelle[zeile].length; spalte++) {
tabelle[zeile][spalte] = zeile*spalte;
}
}
// Das mehrdimensionale Array verwenden, um 5*7 zu berechnen
var produkt = tabelle[5][7]; // 35
3) zu b ) ok, bei "adressen" + i wird eine stringverkettung gemacht, aber bei wertpapier ,warum kommen da keine anfüüüöäuehrungszeichen ?
4)
Die Methode Array.join( ) wandelt alle Elemente des Arrays in Strings um und häaeängt
diese aneinander, wobei zwischen je zwei Elemente ein String gesetzt wird, der der
Methode als Parameter übergeben werden kann. Wenn kein solcher Trenn-String ange-
...
bsp:
var a = [1, 2, 3]; // Erzeuge ein neues Array mit diesen
// drei Elementen
var s = a.join( ); // s == "1,2,3"
was heisst "wobei zwischen je zwei Elemente ein String gesetzt wird," ??
ist das vielleicht , dass was in den klammern stehen kann z. join(", ) ?
5)
a.sort(function(a,b) { // Numerische Ordnung: 4, 33, 222, 1111
return a-b; // Gibt je nachdem < 0, 0 oder > 0 zurueück
});
a)muesste es nicht so heissen :
function sortieren(a,b){
return a-b;
}
a.sort(function sortieren (a,b);
b)
Um ein Array in einer anderen Reihenfolge als der alphabetischen zu sortieren, mueüssen
Sie sort( ) eine Vergleichsfunktion als Argument üuebergeben. Diese Funktion entscheidet,
welches ihrer beiden Argumente im sortierten Array zuerst erscheinen soll. Wenn das
erste Argument vor dem zweiten erscheinen soll, sollte die Vergleichsfunktion eine Zahl
zurueückgeben, die kleiner als null ist, und wenn das erste Argument im sortierten Array
hinter dem zweiten stehen soll, sollte sie eine Zahl zurueückgeben, die groessößer als null ist.
Wenn die beiden Werte äaequivalent sind (d.h., wenn ihre Reihenfolge irrelevant ist), sollte
die Vergleichsfunktion 0 zurueckgeben. Um also zum Beispiel Array-Elemente numerisch
statt alphabetisch zu sortieren, köoennten Sie folgendermaßsen vorgehen:
....
was heisst : "Wenn das erste Argument vor dem zweiten erscheinen soll, sollte die Vergleichsfunktion eine Zahl"...
wie ist das gemeint das "erste argument vor dem zweiten" . bei diesem beispiel
var a = [33, 4, 1111, 222];
a.sort( ); //
gibt es mehr als 2 argumente ich möchte doch nicht 2 argumente vertauschen sondern alle sortieren ?
|
|
25.07.2008 19:54 |
|
|
|
wie wäre es, wenn du mal anfangen würdest dir selbst was anzulesen?
ich mein, ich beantworte dir zwar gerne deine fragen, aber so sehr viel sinn hat das nicht, wenn du nicht mit den einfachsten JS ausdrücken klar kommst ...
__________________ Gräten auf dem Sofakissen wird man wohl entfernen müssen.
|
|
26.07.2008 05:31 |
|
|
|
ich lese es doch , diese zeilen habe ich aus einem buch für javascript (2007).
ich versteh sie nicht ganz, die hätten das bestimmt auch so schreiben können damit das jeder idiot verstehen kann .
ich bin beim lernnen der sprache , ich muss halt vile fragen , wenn ich es nicht verstehe, ist doch normal ?
|
|
26.07.2008 16:43 |
|
|
|