2011-01-09 5 views
0

Die Summe von f (i) für alle ganzen Zahlen i = k, k + 1, .., nur so lange fortführend wie die Bedingung p (i) gilt.Wie würde man diesen mathematischen Ausdruck programmatisch aufschreiben?

Ich werde für:

for (i = 0; i <= V_COUNT; i++) { 
    sum += sine_coeff[i] * pow(E, e_factor[i]) * sin(
    (solar_coeff[i] * solar_anomaly) 
    + (lunar_coeff[i] * lunar_anomaly) 
    + (moon_coeff[i] * moon_argument) 
    ); 
} 

basiert auf der folgenden Common Lisp Code:

  (sigma ((v sine-coeff) 
       (w E-factor) 
       (x solar-coeff) 
       (y lunar-coeff) 
       (z moon-coeff)) 
       (* v (expt cap-E w) 
        (sin-degrees 
        (+ (* x solar-anomaly) 
         (* y lunar-anomaly) 
         (* z moon-argument))))))) 

wo Sigma ist:

(defmacro sigma (list body) 
    ;; TYPE (list-of-pairs (list-of-reals->real)) 
    ;; TYPE -> real 
    ;; $list$ is of the form ((i1 l1)..(in ln)). 
    ;; Sum of $body$ for indices i1..in 
    ;; running simultaneously thru lists l1..ln. 
    `(apply '+ (mapcar (function (lambda 
           ,(mapcar 'car list) 
           ,body)) 
        ,@(mapcar 'cadr list)))) 

(für Source Code siehe Calendrical calculations source code

Bearbeiten Vielen Dank für Ihre Antworten. Bei der Untersuchung der Codebeispiele bin ich zu dem Schluss gekommen, dass der Autor programmtechnisch meint, dass man eine bestimmte Menge von Werten durchlaufen muss. Daraus war leicht zu folgern, dass False zurückgeben musste, wenn es keine Werte mehr hatte, d. H. Die Steuerung hat das Ende der Liste erreicht.

+0

Was meinen Sie, "wie würde ich das programmatisch schreiben", wenn Sie bereits den Common Lisp Code vor Ihren Augen haben? Beleidigend :) –

+0

Lol, ja in der Tat ist die Frage ein linguistischer Fehler, da ich es bereits programmatisch habe;) Der Grund warum ich nicht gefragt habe "wie man das in Sprache x übersetzt" ist, weil ich versuche zu verstehen was tatsächlich passiert Hier. –

Antwort

3

Definieren Sie eine Funktion p(), zB:

bool_t p(int i) 
{ 
    // some conditional code here, that returns TRUE or FALSE 
} 

Es scheint, wie Sie eine Schleife für eine beliebig lange Zeit benötigen (dh es gibt keine harte Obergrenze), und Sie müssen die Schleife stoppen, wenn p(i)FALSE zurückgibt. Deshalb wollen Sie wahrscheinlich eine Schleife etwas wie folgt aus:

int sum = 0; 
for (int i = k; p(i); i++) 
{ 
    sum += f(i); 
} 

Je nachdem, wie groß i und sum bekommen können, können Sie sie als long zu erklären, anstatt int.

+1

oder 'int64_t', da' lang' oft nicht ist. –

2

Etwas wie:

sum = 0; 
i = k; 
while (p(i)) 
    sum += f(i++); 
+0

Sie haben 'p' und' f' geschaltet. –

+0

@tadeusz danke, ich bemerkte gerade zur gleichen Zeit wie Sie kommentiert !! –

Verwandte Themen