如何以编程方式记下这个数学表达式?

时间:2011-01-09 17:25:44

标签: c math lisp

  

所有整数的f(i)之和i =   k,k + 1,..,只持续那么久   条件p(i)成立。

我要去:

 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)
    );
 }

基于以下通用LISP代码:

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

sigma是:

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

(有关完整源代码,请参阅Calendrical calculations source code

修改 谢谢你的所有答案。调查代码示例,我得出的结论是,在编程术语中,作者确实需要循环使用某组值。由此可以很容易地得出结论:p在值已用完时必须返回False,即控制已到达列表的末尾。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

类似的东西:

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