所有整数的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
,即控制已到达列表的末尾。
答案 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);
}
根据i
和sum
的大小,您可能希望将其声明为long
而不是int
。
答案 1 :(得分:2)
类似的东西:
sum = 0;
i = k;
while (p(i))
sum += f(i++);