PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu rekursiver Funktion (c)


AtTheEndofAugust
2008-07-13, 13:29:59
Wieso kommt da beim printf 1 0 0 heraus?

Das erste Mal bekommt die Funktion xxx die Werte b=2 und i=4 geliefert!
Sie ruft sich dann selbst wieder auf mit b=2 und i=2 , dann wieder mit b=2 und i=1 und so weiter

aber wie kommt die Ausgabe zustande?


#include <stdio.h>

void xxx (int b, int i) {
if (i>0)

{
xxx(b,i/b);
printf("%d ",i%b);
}
}

void main()

{int b=2, i=4;

xxx(b, i);

}

SgtDirtbag
2008-07-13, 14:07:01
Die Funktion wird 3x ausgefuehrt, bevor das erste Mal dein printf zum Einsatz kommt (weil der rekursive Aufruf vor printf stattfindet und eine Funktion sozusagen in Warteschleife geht, solange ihr rekursiver Aufruf nicht beendet ist), dadurch ist das erste printf das Ergebnis des letzten rekursiven Aufrufs.

b = 2, i = 4 <--- der erste Aufruf wird als letztes beendet
b = 2, i = 2 <--- der zweite Aufruf wird nach dem letzten Aufruf beendet
b = 2, i = 1 <--- letzter Aufruf, wird als erstes zuende Ausgefuehrt

1%2 geht nicht glatt auf, also bleibt Rest 1, damit haben wir unser erstes Ergebnis (das des letzten Aufrufs).

Erst jetzt werden in Rueckwaertsreihenfolge die anderen beiden Aufrufe der Funktion fortgesetzt.

2%2, Rest 0 weil geht glatt auf.
4%2, Rest 0 weil geht glatt auf.



Alle Angaben ohne Gewaehr. Abweicheungen zu deinem C Code koennen auftreten, weil ich in ActionScript2 programmier. ;)


Hier mein AS2 Code dazu:


function xxx(b:Number, i:Number)
{
// Ich musste hier 0.5 statt 0 verwenden, weil die Funktion sich ansonsten
// undendlich oft aufruft, anscheinend sind Integer in C anders als
// Number in ActionScript
if(i > 0.5)
{
trace("i ist gleich: "+i);
trace("i / b = "+ (i / b))
xxx(b, (i / b) );
trace("---------------------------------------");
updateAfterEvent();
trace("i%b = "+ (i%b));
trace("i ist gleich: "+i);
}
}



xxx(2,4);


Mein Tipp: Wenn du nicht weiss warum etwas sich so verhaelt, erschlag es mit printf Anweisungen (bei mir die trace Aufrufe).

Die Ausgabe auf der Konsole sah dann so aus:


i ist gleich: 4
i / b = 2
i ist gleich: 2
i / b = 1
i ist gleich: 1
i / b = 0.5
---------------------------------------
i%b = 1
i ist gleich: 1
---------------------------------------
i%b = 0
i ist gleich: 2
---------------------------------------
i%b = 0
i ist gleich: 4

AtTheEndofAugust
2008-07-13, 14:31:15
okay aber wieso ruft sich die Funktion lediglich dreimal selbst auf?

i ist doch in dem code immer > 0 (kann nicht 0 oder kleiner werden)

und wieso stellt das print f die Werte "verdreht" dar?

e: funktioniert der Modulo Operator nur mit integern? und nicht mit floats???

DivisionByZero
2008-07-13, 14:45:50
Sobald i == 0 bricht die Rekursion ab, und dies geschieht beim Aufruf mit i = 1 / 2 = 0.

Wieso sollte printf verkehrt rum drucken? Du steigst auf die unterste Ebene hinab und druckst i%b aus, dann gehst du wieder ne stufe zurück und druckst dort wieder.

Bzgl. Modulo... nun ja... Modulo ist nunmal nur auf Integern definiert. Frag mal die Mathematiker warums für andere Zahlen nicht definiert ist... Das ganze geht in den Bereich Gruppentheorie der diskreten Mathematik :)

SgtDirtbag
2008-07-13, 14:50:59
okay aber wieso ruft sich die Funktion lediglich dreimal selbst auf?

i ist doch in dem code immer > 0 (kann nicht 0 oder kleiner werden)
Wunderbare Frage, auf die ich leider keine Antwort hab.
Wie ich in meinem Codecomment bereits erwaehnt habe, explodiert die Funktion in ActionScript, wenn ich dort i > 0 stehen lass, und zwar mit folgender Meldung:
(scroll mal bis zum Ende, da steht die Meldung)


i ist gleich: 4
i / b = 2
i ist gleich: 2
i / b = 1
i ist gleich: 1
i / b = 0.5
i ist gleich: 0.5
i / b = 0.25
i ist gleich: 0.25
i / b = 0.125
i ist gleich: 0.125
i / b = 0.0625
i ist gleich: 0.0625
i / b = 0.03125
i ist gleich: 0.03125
i / b = 0.015625
i ist gleich: 0.015625
i / b = 0.0078125
i ist gleich: 0.0078125
i / b = 0.00390625
i ist gleich: 0.00390625
i / b = 0.001953125
i ist gleich: 0.001953125
i / b = 0.0009765625
i ist gleich: 0.0009765625
i / b = 0.00048828125
i ist gleich: 0.00048828125
i / b = 0.000244140625
i ist gleich: 0.000244140625
i / b = 0.0001220703125
i ist gleich: 0.0001220703125
i / b = 0.00006103515625
i ist gleich: 0.00006103515625
i / b = 0.000030517578125
i ist gleich: 0.000030517578125
i / b = 0.0000152587890625
i ist gleich: 0.0000152587890625
i / b = 7.62939453125e-6
i ist gleich: 7.62939453125e-6
i / b = 3.814697265625e-6
i ist gleich: 3.814697265625e-6
i / b = 1.9073486328125e-6
i ist gleich: 1.9073486328125e-6
i / b = 9.5367431640625e-7
i ist gleich: 9.5367431640625e-7
i / b = 4.76837158203125e-7
i ist gleich: 4.76837158203125e-7
i / b = 2.38418579101563e-7
i ist gleich: 2.38418579101563e-7
i / b = 1.19209289550781e-7
i ist gleich: 1.19209289550781e-7
i / b = 5.96046447753906e-8
i ist gleich: 5.96046447753906e-8
i / b = 2.98023223876953e-8
i ist gleich: 2.98023223876953e-8
i / b = 1.49011611938477e-8
i ist gleich: 1.49011611938477e-8
i / b = 7.45058059692383e-9
i ist gleich: 7.45058059692383e-9
i / b = 3.72529029846191e-9
i ist gleich: 3.72529029846191e-9
i / b = 1.86264514923096e-9
i ist gleich: 1.86264514923096e-9
i / b = 9.31322574615479e-10
i ist gleich: 9.31322574615479e-10
i / b = 4.65661287307739e-10
i ist gleich: 4.65661287307739e-10
i / b = 2.3283064365387e-10
i ist gleich: 2.3283064365387e-10
i / b = 1.16415321826935e-10
i ist gleich: 1.16415321826935e-10
i / b = 5.82076609134674e-11
i ist gleich: 5.82076609134674e-11
i / b = 2.91038304567337e-11
i ist gleich: 2.91038304567337e-11
i / b = 1.45519152283669e-11
i ist gleich: 1.45519152283669e-11
i / b = 7.27595761418343e-12
i ist gleich: 7.27595761418343e-12
i / b = 3.63797880709171e-12
i ist gleich: 3.63797880709171e-12
i / b = 1.81898940354586e-12
i ist gleich: 1.81898940354586e-12
i / b = 9.09494701772928e-13
i ist gleich: 9.09494701772928e-13
i / b = 4.54747350886464e-13
i ist gleich: 4.54747350886464e-13
i / b = 2.27373675443232e-13
i ist gleich: 2.27373675443232e-13
i / b = 1.13686837721616e-13
i ist gleich: 1.13686837721616e-13
i / b = 5.6843418860808e-14
i ist gleich: 5.6843418860808e-14
i / b = 2.8421709430404e-14
i ist gleich: 2.8421709430404e-14
i / b = 1.4210854715202e-14
i ist gleich: 1.4210854715202e-14
i / b = 7.105427357601e-15
i ist gleich: 7.105427357601e-15
i / b = 3.5527136788005e-15
i ist gleich: 3.5527136788005e-15
i / b = 1.77635683940025e-15
i ist gleich: 1.77635683940025e-15
i / b = 8.88178419700125e-16
i ist gleich: 8.88178419700125e-16
i / b = 4.44089209850063e-16
i ist gleich: 4.44089209850063e-16
i / b = 2.22044604925031e-16
i ist gleich: 2.22044604925031e-16
i / b = 1.11022302462516e-16
i ist gleich: 1.11022302462516e-16
i / b = 5.55111512312578e-17
i ist gleich: 5.55111512312578e-17
i / b = 2.77555756156289e-17
i ist gleich: 2.77555756156289e-17
i / b = 1.38777878078145e-17
i ist gleich: 1.38777878078145e-17
i / b = 6.93889390390723e-18
i ist gleich: 6.93889390390723e-18
i / b = 3.46944695195361e-18
i ist gleich: 3.46944695195361e-18
i / b = 1.73472347597681e-18
i ist gleich: 1.73472347597681e-18
i / b = 8.67361737988404e-19
i ist gleich: 8.67361737988404e-19
i / b = 4.33680868994202e-19
i ist gleich: 4.33680868994202e-19
i / b = 2.16840434497101e-19
i ist gleich: 2.16840434497101e-19
i / b = 1.0842021724855e-19
i ist gleich: 1.0842021724855e-19
i / b = 5.42101086242752e-20
i ist gleich: 5.42101086242752e-20
i / b = 2.71050543121376e-20
i ist gleich: 2.71050543121376e-20
i / b = 1.35525271560688e-20
i ist gleich: 1.35525271560688e-20
i / b = 6.7762635780344e-21
i ist gleich: 6.7762635780344e-21
i / b = 3.3881317890172e-21
i ist gleich: 3.3881317890172e-21
i / b = 1.6940658945086e-21
i ist gleich: 1.6940658945086e-21
i / b = 8.470329472543e-22
i ist gleich: 8.470329472543e-22
i / b = 4.2351647362715e-22
i ist gleich: 4.2351647362715e-22
i / b = 2.11758236813575e-22
i ist gleich: 2.11758236813575e-22
i / b = 1.05879118406788e-22
i ist gleich: 1.05879118406788e-22
i / b = 5.29395592033938e-23
i ist gleich: 5.29395592033938e-23
i / b = 2.64697796016969e-23
i ist gleich: 2.64697796016969e-23
i / b = 1.32348898008484e-23
i ist gleich: 1.32348898008484e-23
i / b = 6.61744490042422e-24
i ist gleich: 6.61744490042422e-24
i / b = 3.30872245021211e-24
i ist gleich: 3.30872245021211e-24
i / b = 1.65436122510606e-24
i ist gleich: 1.65436122510606e-24
i / b = 8.27180612553028e-25
i ist gleich: 8.27180612553028e-25
i / b = 4.13590306276514e-25
i ist gleich: 4.13590306276514e-25
i / b = 2.06795153138257e-25
i ist gleich: 2.06795153138257e-25
i / b = 1.03397576569128e-25
i ist gleich: 1.03397576569128e-25
i / b = 5.16987882845642e-26
i ist gleich: 5.16987882845642e-26
i / b = 2.58493941422821e-26
i ist gleich: 2.58493941422821e-26
i / b = 1.29246970711411e-26
i ist gleich: 1.29246970711411e-26
i / b = 6.46234853557053e-27
i ist gleich: 6.46234853557053e-27
i / b = 3.23117426778526e-27
i ist gleich: 3.23117426778526e-27
i / b = 1.61558713389263e-27
i ist gleich: 1.61558713389263e-27
i / b = 8.07793566946316e-28
i ist gleich: 8.07793566946316e-28
i / b = 4.03896783473158e-28
i ist gleich: 4.03896783473158e-28
i / b = 2.01948391736579e-28
i ist gleich: 2.01948391736579e-28
i / b = 1.0097419586829e-28
i ist gleich: 1.0097419586829e-28
i / b = 5.04870979341448e-29
i ist gleich: 5.04870979341448e-29
i / b = 2.52435489670724e-29
i ist gleich: 2.52435489670724e-29
i / b = 1.26217744835362e-29
i ist gleich: 1.26217744835362e-29
i / b = 6.31088724176809e-30
i ist gleich: 6.31088724176809e-30
i / b = 3.15544362088405e-30
i ist gleich: 3.15544362088405e-30
i / b = 1.57772181044202e-30
i ist gleich: 1.57772181044202e-30
i / b = 7.88860905221012e-31
i ist gleich: 7.88860905221012e-31
i / b = 3.94430452610506e-31
i ist gleich: 3.94430452610506e-31
i / b = 1.97215226305253e-31
i ist gleich: 1.97215226305253e-31
i / b = 9.86076131526265e-32
i ist gleich: 9.86076131526265e-32
i / b = 4.93038065763132e-32
i ist gleich: 4.93038065763132e-32
i / b = 2.46519032881566e-32
i ist gleich: 2.46519032881566e-32
i / b = 1.23259516440783e-32
i ist gleich: 1.23259516440783e-32
i / b = 6.16297582203916e-33
i ist gleich: 6.16297582203916e-33
i / b = 3.08148791101958e-33
i ist gleich: 3.08148791101958e-33
i / b = 1.54074395550979e-33
i ist gleich: 1.54074395550979e-33
i / b = 7.70371977754894e-34
i ist gleich: 7.70371977754894e-34
i / b = 3.85185988877447e-34
i ist gleich: 3.85185988877447e-34
i / b = 1.92592994438724e-34
i ist gleich: 1.92592994438724e-34
i / b = 9.62964972193618e-35
i ist gleich: 9.62964972193618e-35
i / b = 4.81482486096809e-35
i ist gleich: 4.81482486096809e-35
i / b = 2.40741243048404e-35
i ist gleich: 2.40741243048404e-35
i / b = 1.20370621524202e-35
i ist gleich: 1.20370621524202e-35
i / b = 6.01853107621011e-36
i ist gleich: 6.01853107621011e-36
i / b = 3.00926553810506e-36
i ist gleich: 3.00926553810506e-36
i / b = 1.50463276905253e-36
i ist gleich: 1.50463276905253e-36
i / b = 7.52316384526264e-37
i ist gleich: 7.52316384526264e-37
i / b = 3.76158192263132e-37
i ist gleich: 3.76158192263132e-37
i / b = 1.88079096131566e-37
i ist gleich: 1.88079096131566e-37
i / b = 9.4039548065783e-38
i ist gleich: 9.4039548065783e-38
i / b = 4.70197740328915e-38
i ist gleich: 4.70197740328915e-38
i / b = 2.35098870164457e-38
i ist gleich: 2.35098870164457e-38
i / b = 1.17549435082229e-38
i ist gleich: 1.17549435082229e-38
i / b = 5.87747175411144e-39
i ist gleich: 5.87747175411144e-39
i / b = 2.93873587705572e-39
i ist gleich: 2.93873587705572e-39
i / b = 1.46936793852786e-39
i ist gleich: 1.46936793852786e-39
i / b = 7.3468396926393e-40
i ist gleich: 7.3468396926393e-40
i / b = 3.67341984631965e-40
i ist gleich: 3.67341984631965e-40
i / b = 1.83670992315982e-40
i ist gleich: 1.83670992315982e-40
i / b = 9.18354961579912e-41
i ist gleich: 9.18354961579912e-41
i / b = 4.59177480789956e-41
i ist gleich: 4.59177480789956e-41
i / b = 2.29588740394978e-41
i ist gleich: 2.29588740394978e-41
i / b = 1.14794370197489e-41
i ist gleich: 1.14794370197489e-41
i / b = 5.73971850987445e-42
i ist gleich: 5.73971850987445e-42
i / b = 2.86985925493723e-42
i ist gleich: 2.86985925493723e-42
i / b = 1.43492962746861e-42
i ist gleich: 1.43492962746861e-42
i / b = 7.17464813734306e-43
i ist gleich: 7.17464813734306e-43
i / b = 3.58732406867153e-43
i ist gleich: 3.58732406867153e-43
i / b = 1.79366203433577e-43
i ist gleich: 1.79366203433577e-43
i / b = 8.96831017167883e-44
i ist gleich: 8.96831017167883e-44
i / b = 4.48415508583942e-44
i ist gleich: 4.48415508583942e-44
i / b = 2.24207754291971e-44
i ist gleich: 2.24207754291971e-44
i / b = 1.12103877145985e-44
i ist gleich: 1.12103877145985e-44
i / b = 5.60519385729927e-45
i ist gleich: 5.60519385729927e-45
i / b = 2.80259692864963e-45
i ist gleich: 2.80259692864963e-45
i / b = 1.40129846432482e-45
i ist gleich: 1.40129846432482e-45
i / b = 7.00649232162409e-46
i ist gleich: 7.00649232162409e-46
i / b = 3.50324616081204e-46
i ist gleich: 3.50324616081204e-46
i / b = 1.75162308040602e-46
i ist gleich: 1.75162308040602e-46
i / b = 8.75811540203011e-47
i ist gleich: 8.75811540203011e-47
i / b = 4.37905770101505e-47
i ist gleich: 4.37905770101505e-47
i / b = 2.18952885050753e-47
i ist gleich: 2.18952885050753e-47
i / b = 1.09476442525376e-47
i ist gleich: 1.09476442525376e-47
i / b = 5.47382212626882e-48
i ist gleich: 5.47382212626882e-48
i / b = 2.73691106313441e-48
i ist gleich: 2.73691106313441e-48
i / b = 1.3684555315672e-48
i ist gleich: 1.3684555315672e-48
i / b = 6.84227765783602e-49
i ist gleich: 6.84227765783602e-49
i / b = 3.42113882891801e-49
i ist gleich: 3.42113882891801e-49
i / b = 1.71056941445901e-49
i ist gleich: 1.71056941445901e-49
i / b = 8.55284707229503e-50
i ist gleich: 8.55284707229503e-50
i / b = 4.27642353614751e-50
i ist gleich: 4.27642353614751e-50
i / b = 2.13821176807376e-50
i ist gleich: 2.13821176807376e-50
i / b = 1.06910588403688e-50
i ist gleich: 1.06910588403688e-50
i / b = 5.34552942018439e-51
i ist gleich: 5.34552942018439e-51
i / b = 2.6727647100922e-51
i ist gleich: 2.6727647100922e-51
i / b = 1.3363823550461e-51
i ist gleich: 1.3363823550461e-51
i / b = 6.68191177523049e-52
i ist gleich: 6.68191177523049e-52
i / b = 3.34095588761524e-52
i ist gleich: 3.34095588761524e-52
i / b = 1.67047794380762e-52
i ist gleich: 1.67047794380762e-52
i / b = 8.35238971903811e-53
i ist gleich: 8.35238971903811e-53
i / b = 4.17619485951906e-53
i ist gleich: 4.17619485951906e-53
i / b = 2.08809742975953e-53
i ist gleich: 2.08809742975953e-53
i / b = 1.04404871487976e-53
i ist gleich: 1.04404871487976e-53
i / b = 5.22024357439882e-54
i ist gleich: 5.22024357439882e-54
i / b = 2.61012178719941e-54
i ist gleich: 2.61012178719941e-54
i / b = 1.30506089359971e-54
i ist gleich: 1.30506089359971e-54
i / b = 6.52530446799852e-55
i ist gleich: 6.52530446799852e-55
i / b = 3.26265223399926e-55
i ist gleich: 3.26265223399926e-55
i / b = 1.63132611699963e-55
i ist gleich: 1.63132611699963e-55
i / b = 8.15663058499816e-56
i ist gleich: 8.15663058499816e-56
i / b = 4.07831529249908e-56
i ist gleich: 4.07831529249908e-56
i / b = 2.03915764624954e-56
i ist gleich: 2.03915764624954e-56
i / b = 1.01957882312477e-56
i ist gleich: 1.01957882312477e-56
i / b = 5.09789411562385e-57
i ist gleich: 5.09789411562385e-57
i / b = 2.54894705781192e-57
i ist gleich: 2.54894705781192e-57
i / b = 1.27447352890596e-57
i ist gleich: 1.27447352890596e-57
i / b = 6.37236764452981e-58
i ist gleich: 6.37236764452981e-58
i / b = 3.1861838222649e-58
i ist gleich: 3.1861838222649e-58
i / b = 1.59309191113245e-58
i ist gleich: 1.59309191113245e-58
i / b = 7.96545955566226e-59
i ist gleich: 7.96545955566226e-59
i / b = 3.98272977783113e-59
i ist gleich: 3.98272977783113e-59
i / b = 1.99136488891557e-59
i ist gleich: 1.99136488891557e-59
i / b = 9.95682444457783e-60
i ist gleich: 9.95682444457783e-60
i / b = 4.97841222228891e-60
i ist gleich: 4.97841222228891e-60
i / b = 2.48920611114446e-60
i ist gleich: 2.48920611114446e-60
i / b = 1.24460305557223e-60
i ist gleich: 1.24460305557223e-60
i / b = 6.22301527786114e-61
i ist gleich: 6.22301527786114e-61
i / b = 3.11150763893057e-61
i ist gleich: 3.11150763893057e-61
i / b = 1.55575381946529e-61
i ist gleich: 1.55575381946529e-61
i / b = 7.77876909732643e-62
i ist gleich: 7.77876909732643e-62
i / b = 3.88938454866321e-62
i ist gleich: 3.88938454866321e-62
i / b = 1.94469227433161e-62
i ist gleich: 1.94469227433161e-62
i / b = 9.72346137165803e-63
i ist gleich: 9.72346137165803e-63
i / b = 4.86173068582902e-63
i ist gleich: 4.86173068582902e-63
i / b = 2.43086534291451e-63
i ist gleich: 2.43086534291451e-63
i / b = 1.21543267145725e-63
i ist gleich: 1.21543267145725e-63
i / b = 6.07716335728627e-64
i ist gleich: 6.07716335728627e-64
i / b = 3.03858167864314e-64
i ist gleich: 3.03858167864314e-64
i / b = 1.51929083932157e-64
i ist gleich: 1.51929083932157e-64
i / b = 7.59645419660784e-65
i ist gleich: 7.59645419660784e-65
i / b = 3.79822709830392e-65
i ist gleich: 3.79822709830392e-65
i / b = 1.89911354915196e-65
i ist gleich: 1.89911354915196e-65
i / b = 9.4955677457598e-66
i ist gleich: 9.4955677457598e-66
i / b = 4.7477838728799e-66
i ist gleich: 4.7477838728799e-66
i / b = 2.37389193643995e-66
i ist gleich: 2.37389193643995e-66
i / b = 1.18694596821998e-66
i ist gleich: 1.18694596821998e-66
i / b = 5.93472984109988e-67
i ist gleich: 5.93472984109988e-67
i / b = 2.96736492054994e-67
i ist gleich: 2.96736492054994e-67
i / b = 1.48368246027497e-67
i ist gleich: 1.48368246027497e-67
i / b = 7.41841230137484e-68
i ist gleich: 7.41841230137484e-68
i / b = 3.70920615068742e-68
i ist gleich: 3.70920615068742e-68
i / b = 1.85460307534371e-68
i ist gleich: 1.85460307534371e-68
i / b = 9.27301537671855e-69
i ist gleich: 9.27301537671855e-69
i / b = 4.63650768835928e-69
i ist gleich: 4.63650768835928e-69
i / b = 2.31825384417964e-69
i ist gleich: 2.31825384417964e-69
i / b = 1.15912692208982e-69
i ist gleich: 1.15912692208982e-69
i / b = 5.7956346104491e-70
i ist gleich: 5.7956346104491e-70
i / b = 2.89781730522455e-70
i ist gleich: 2.89781730522455e-70
i / b = 1.44890865261227e-70
i ist gleich: 1.44890865261227e-70
i / b = 7.24454326306137e-71
i ist gleich: 7.24454326306137e-71
i / b = 3.62227163153069e-71
i ist gleich: 3.62227163153069e-71
i / b = 1.81113581576534e-71
i ist gleich: 1.81113581576534e-71
i / b = 9.05567907882671e-72
i ist gleich: 9.05567907882671e-72
i / b = 4.52783953941336e-72
i ist gleich: 4.52783953941336e-72
i / b = 2.26391976970668e-72
i ist gleich: 2.26391976970668e-72
i / b = 1.13195988485334e-72
i ist gleich: 1.13195988485334e-72
i / b = 5.6597994242667e-73
i ist gleich: 5.6597994242667e-73
i / b = 2.82989971213335e-73
i ist gleich: 2.82989971213335e-73
i / b = 1.41494985606667e-73
i ist gleich: 1.41494985606667e-73
i / b = 7.07474928033337e-74
i ist gleich: 7.07474928033337e-74
i / b = 3.53737464016669e-74
i ist gleich: 3.53737464016669e-74
i / b = 1.76868732008334e-74
i ist gleich: 1.76868732008334e-74
i / b = 8.84343660041671e-75
i ist gleich: 8.84343660041671e-75
i / b = 4.42171830020836e-75
i ist gleich: 4.42171830020836e-75
i / b = 2.21085915010418e-75
i ist gleich: 2.21085915010418e-75
i / b = 1.10542957505209e-75
i ist gleich: 1.10542957505209e-75
i / b = 5.52714787526045e-76
i ist gleich: 5.52714787526045e-76
i / b = 2.76357393763022e-76
i ist gleich: 2.76357393763022e-76
i / b = 1.38178696881511e-76
i ist gleich: 1.38178696881511e-76
i / b = 6.90893484407556e-77
256 Rekursionsstufen wurden in einer Aktionsliste überschritten.
Es handelt sich wahrscheinlich um eine Endlosschleife.
In diesem Film werden keine weiteren Aktionen ausgeführt.

Theoretisch muesste deine Funktion eine Endlosschleiffe ausloesen, darum meine Vermutung dass C Integer ab einer bestimmten laenge anders interpretiert als ActionScript Numbers, aber ich programmier erst seit Januar, da kenn ich mich nicht so gut aus.

und wieso stellt das print f die Werte "verdreht" dar?
Nehmen wir an, deine Funktion wuerde A heissen, der Erste Aufruf A1, der zweite Aufruf A2 etc. dann wuerde das so aussehen:


A1 lauft, kommt zum rekursiven Aufruf, ruft sich selbst auf, bevor printf ausgeloest wird, und geht in den Wartemodus.
Wie ich im letzten Beitrab schrieb, eine Funktion stoppt an einem rekursiven Aufruf, bis dieser komplett abgeschlossen ist.
Nun lauft A2, da A1 ja wartet, bis diese Funktion durch ist, kommt zum rekursiven Aufruf, ruft sich selbst auf, bevor printf ausgeloest wird, und geht ebenfalls in den Wartemodus
A3 lauft nun auch durch, kommt zum rekursiven Aufruf, ruft sich selbst auf, bevor printf ausgeloest wird, und geht ebenfalls in den Wartemodus.
Der rekursive Aufruf in A3, also A4, besteht in meinem Beispiel die Huerde von i > 0.5 nicht und A4 wird beendet.
Wir erstellen hier praktisch eine Kette von aufeinander wartenden Funktionsaufrufen:

A1 wartet auf: A2 wartet auf: A3 wartet auf: A4

Die Wartekette funktioniert damit so aehnlich wie ein LIFO (Last In First Out) Array:

Da A4 ja bereits an der Abfrage i > 0 beendet war, kommen wir zurueck zu A3, dass ja auf die Beendung von A4 gewartet hat und endlich zuende laufen kann.
Deshalb findet in A3 der erste printf Aufruf statt, weil A3 als letzter in der "Wartekette steht" und deshalb als erste Funktion komplett zuende laeuft:
b = 2, i = 1
1%2 = Rest 1

A3 ist nun fertig, worauf A2 ja schon sehnsuechtig gewartet hat und auch endlich durchlaufen kann:
b = 2, i = 2
2%2 = Rest 0

A2 ist nun fertig, worauf A1 gewartet hat:
b = 2, i = 2
2%2 = Rest 0

Senior Sanchez
2008-07-13, 15:08:22
Wunderbare Frage, auf die ich leider keine Antwort hab.
Theoretisch muesste deine Funktion eine Endlosschleiffe ausloesen, darum meine Vermutung dass C Integer ab einer bestimmten laenge anders interpretiert als ActionScript Numbers, aber ich programmier erst seit Januar, da kenn ich mich nicht so gut aus.


Nein, es löst keine Endlosschleife aus, da eine Division auf Integer immer eine ganzzahlige Division in C/C++ ist. Dein ActionScript interpretiert es aber eigentlich als Fließkommazahl - deswegen kommen da auch Kommazahlen bei raus, was bei einer Ganzzahl ja nicht passieren kann.

AtTheEndofAugust
2008-07-13, 15:11:52
habs jetzt kapiert

wow Danke man du hast das echt super und verständlich erklärt, dickes Kompliment!!!

SgtDirtbag
2008-07-13, 15:12:06
Nein, es löst keine Endlosschleife aus, da eine Division auf Integer immer eine ganzzahlige Division in C/C++ ist. Dein ActionScript interpretiert es aber eigentlich als Fließkommazahl - deswegen kommen da auch Kommazahlen bei raus, was bei einer Ganzzahl ja nicht passieren kann.Das ist dann wohl der von mir vermutete Unterschied Int <-> Number.
Danke. :)

habs jetzt kapiert

wow Danke man du hast das echt super und verständlich erklärt, dickes Kompliment!!!
Falls du mich meinst, danke. :)

Gast
2008-07-13, 15:42:51
http://www.galileocomputing.de/openbook/c_von_a_bis_z/c_022_002.htm#RxxobKap02200204002B741F03018C

Mit der math.h gibt es fmod() zum Berechnen von Module von Floats

AtTheEndofAugust
2008-07-13, 16:00:44
Mal ne kurze andere Frage:





Matrizenwerte sind 2 4 6
8 10 12
14 16 18




printf("\n obere dreiecksmatrix ausgeben");

for(i=0;i<n;i++)
{ printf("\n");
if (i>0) for (j=0;j<i;j++) printf(" ");
for (j=i;j<n;j++) {
printf(" %3d",matc[i][j]);
}

}



rauskommt

2 4 6
10 12
18










In der 2. Zeile ist i=1, also gehts in die if anweisung, und dort wird dir erste Lücke in der zweiten Zeile produziert.

Daraufhin wird ja j inkrementiert und ist ja nicht mehr <i

geht das programm dann aus dieser For Schleife raus und in die darunterliegende oder wie hab ich mir das vorzustellen?

Gleiche Frage bei i=2

DivisionByZero
2008-07-13, 16:25:22
ja

AtTheEndofAugust
2008-09-26, 10:47:38
Wenn ich hier eine Eingabe mache, kommt immer 0 heraus!

Was müsste denn eigentlich herauskommen? ich kriegs nicht raus



{int a=1,b=8;

float x;

x=a/b;

printf("%d",x); printf("\n");

x=a/b;

printf("%d",x); printf("\n");

x=(a/b);

printf("%d",x); printf("\n");


}

robobimbo
2008-09-26, 11:17:48
Ich glaub Du durchschaust den Algorithmus nicht :)

b gibt die Basis des Zahlensystemes an, wenn da 8 steht, dann wandelt er die Zahl die du bei i eingibst in eine Oktalzahl um und nicht in eine Dualzahl, weil eine Dualzahl eine Basis von ___ hat.

Bitte selbst rausfinden, für den Lerneffekt

AtTheEndofAugust
2008-09-26, 11:41:34
hab ich schon geschnallt danke dir!

Und deswegen auch nen Edit gemacht

robobimbo
2008-09-26, 12:30:00
du dividierst zwei interzahlen - und auch wenn du das ergebnis in eine fliesskommzahl abspeicherst, der ausdruck wird ganzzahlig ausgewertet.

a.) du musst die beiden ganzenzahlen in einen passenden flieskommazahlentyp casten, dann wird der ausdruck so ausgwertet wie du es haben willst.

d.) du deklarierst die beiden zahlen gleich als fliesskommazahlen