2011-01-09 5 views
0

조건 p (i)로서 길이가 인 모든 정수 i = k, k + 1, ..에 대한 f (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)))) 

(전체 소스 코드에 대한 다음과 같은 일반적인 LISP 코드를 기반으로

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

:

나는 갈거야 , Calendrical calculations source code

를 참조하십시오.

답장을 보내 주셔서 감사합니다. 코드 예제를 살펴보면, 필자는 프로그래밍 측면에서 저자가 실제로 특정 값 집합을 반복해야한다는 결론에 도달했습니다. 그렇기 때문에 p은 값이 부족한 경우, 즉 컨트롤이 목록의 끝에 도달했을 때 False을 반환해야한다고 결론지었습니다.

+0

이미 눈앞에 커먼 리스프 코드가있을 때 "프로그래밍으로 어떻게 써야합니까?"라는게 무슨 뜻입니까? 모욕 :) –

+0

Lol, 네, 실제로 질문은 언어 적으로 실패한 것입니다. 이미 프로그래밍 방식으로 작성했기 때문에) "언어 x로 변환하는 방법"을 묻지 않은 이유는 실제로 발생하는 것을 이해하려고하기 때문입니다. 이리. –

답변

3

함수 p(), 예를 들어 정의 : 사용자가 임의의 오랜 시간 동안 반복 할 필요가 같은

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

것 같다 (즉, 더 하드 상한은 없다)을하고, p(i)FALSE을 반환하면 루핑을 중지해야합니다. isum가 얻을 수있는 방법 큰, 당신은 long보다는 int로 선언 할 수 있습니다에

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

따라 : 따라서, 당신은 아마 루프 같은 것을 원한다.

+1

또는'int64_t','long'은 종종 그렇지 않기 때문에. –

2

뭔가 같은 :

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

'p'와'f'를 바꿨습니다. –

+0

@ tadeusz 감사합니다. 나는 당신이 해설 한 것과 동시에 동시에 주목했다 !! –

관련 문제