2011-01-09 31 views
0

對於所有整數i(= i = k,k + 1,...)的f(i)的總和,只有當條件p(i)成立時才持續爲 。如何以編程的方式寫下這個數學表達式?

我要去爲:

  (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))))))) 

其中西格瑪是:

(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)))) 

(完整的源代碼

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) 
    ); 
} 
基於以下的Common Lisp代碼

,見Calendrical calculations source code

編輯 感謝您的所有答案。研究代碼示例,我得出結論,在編程方面,作者確實認爲必須循環一定的值。由此可以很容易得出結論,p在其值已經用完時不得不返回False,即控制已經到達列表的末尾。

+0

當你已經將Common Lisp代碼放在眼前時,你的意思是「我該如何編程編寫這個程序」?侮辱:) – 2011-01-09 17:37:32

+0

大聲笑,是的,這確實是一個語言失敗的問題,因爲我已經有了它編程;)我沒有問「如何將其翻譯成語言x」的原因是因爲我試圖瞭解實際發生了什麼這裏。 – 2011-01-09 17:43:18

回答

3

定義一個函數p(),如:

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

好像你需要循環任意長的時間(即沒有硬上限),和當p(i)返回FALSE時,您需要停止循環。因此,你可能希望一個循環是這樣的:

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

取決於如何大isum可以得到,你可能需要將它們聲明爲long而非int

2

喜歡的東西:

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

你已經切換了`p`和`f`。 – 2011-01-09 17:37:10

相關問題