Как записать это математическое выражение программно? - PullRequest
0 голосов
/ 09 января 2011

Сумма 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)))))))

где сигма:

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

(полный исходный код см. Исходный код календарных вычислений

Редактировать Спасибо за все ваши ответы. Исследуя примеры кода, я пришел к выводу, что в терминах программирования, автор действительно подразумевает, что нужно перебрать определенный набор значений. Из этого было легко сделать вывод, что p должен был возвращать False, когда у него закончились значения, т. Е. Управление достигло конца списка.

Ответы [ 2 ]

3 голосов
/ 09 января 2011

Определить функцию 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.

2 голосов
/ 09 января 2011

Что-то вроде:

sum = 0;
i = k;
while (p(i))
    sum += f(i++);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...