2011-09-03 6 views
1

Scheme을 배우고 있으며 기본 사항을 읽었지만 Java 클래스를 Scheme 코드에 "매핑"하는 방법을 여전히 이해할 수 없습니다. 너희들이 여기서 나를 도울 수 있니? 은 "관용적 내가 너무 많은 숙제처럼 보이는 무언가를 대답하지 않았을이 Java 코드를 Scheme으로 번역하면 도움이 될 것입니다.

public class sumFibonacciValues { 
    public static void main(String [] args) { 
     int n = 4000000; 
     long i2 = 1, i1 = 1, Fibo = 0, temp = 1; 
     while(i2 < n) { 
      temp = i1 + i2; 
      i1 = i2; 
      i2 = temp; 
      if(i2 % 2 == 0) 
       Fibo += i2; 
     } 
     System.out.println(Fibo); 
    } 
} 
+0

그래서 코드 생성 기계가 아닙니다. –

+0

코드 생성을 요구하지 않고 코드 변환을 요청합니다. 나 자신의 코드를 작성할 수는 있지만, 여기에 Scheme에 게시하는 것과 같은 것을 작성한 적이 없으며 이것이 어떻게 진행되는지 파악하는 데 도움이 필요하다. – Tsundoku

+0

나는 Scheme에 대한 직접적인 "상태있는"매핑이 가능하다고 생각하지만,이 프로그램의 관용적 인 Scheme 구현은 매우 달라 보일 것이다. 저의 스킴 기술은 녹슨 것이므로 답변에 기여할 수는 없지만 경고해야합니다. –

답변

9

:하지만, 난 그냥이 최종 세부 사항을 파악하고 일이 내 머리에 가야 계획에 모양을 보여줘 사람이 필요 "논평은 실제로 그것이 그렇게 멀지 않다는 데모를 요청했습니다. 첫째, 직접 번역 :

(define (sum-fibonacci-values) 
    (define n 4000000) 
    (define i2 1) 
    (define i1 1) 
    (define fibo 0) 
    (define temp 1) 
    (let loop() 
    (when (< i2 n) 
     (set! temp (+ i1 i2)) 
     (set! i1 i2) 
     (set! i2 temp) 
     (when (zero? (modulo i2 2)) (set! fibo (+ fibo i2))) 
     (loop))) 
    (write fibo)) 

둘째, 중복 변이를 제거함으로써, "관용"만들고, 대신 새 값을 결합하고, 꼬리 재귀 루프를 사용. 이 코드는 원래와 직접적인 상관 관계가 여전히 참고 :

(define (sum-fibonacci-values) 
    (define n 4000000) 
    (let loop ([i2 1] [i1 1] [fibo 0] [temp 1]) 
    (if (< i2 n) 
     (let* ([temp (+ i1 i2)] 
      [i1 i2] 
      [i2 temp] 
      [fibo (if (zero? (modulo i2 2)) (+ fibo i2) fibo)]) 
     (loop i2 i1 fibo temp)) 
     fibo))) 

마지막으로, 지금은 코드가 명확 것으로, 일부 중복이 있다는 것을 알 수있다. 다음은 정리 된 버전입니다.

(define (sum-fibonacci-values) 
    (define n 4000000) 
    (let loop ([i2 1] [i1 1] [fibo 0]) 
    (if (< i2 n) 
     (let ([i3 (+ i1 i2)]) 
     (loop i3 i2 (if (zero? (modulo i3 2)) (+ fibo i3) fibo))) 
     fibo))) 

Java 코드에서 동일한 정리 작업을 수행 할 수 있습니다. (그러나 그것은 독자에게 운동으로 남았습니다 ...)

+0

귀하의 답변은 Luis Armando의 Schema Java 매핑 요청에 정확하게 부합합니다. Scheme을 배우면 유용 할 것입니다. 그러나 동일한 작업 (피보나치 숫자조차도 첫 번째 피쳐를 합산 한 것)이 주어 졌음을 지적하고 Java 구현을 시작하지 않아도된다는 결과가 도출되었다는 점을 지적하면 가치가 있다고 생각합니다. 결과 코드는 다를 수 있습니다. 이는 내가 시도한 요점입니다. 내 "관용적 인"의견으로 만들 수 있습니다. 나는 이것이 루이스 아르만도가 요청한 것 이상일 수도 있음을 인정한다. –

+0

숙제 문제로 보입니다.하지만 확신 할 수는 없지만 몇 가지 재미있는 생각을 필요로하는 예제가 필요했습니다. 몇 달 전에 작성한이 코드 조각이 내 마음에 처음 도착했습니다. 정말 고마워, Scheme =을 사용하여 작업하는 방법에 대한 아이디어를 얻을 수있었습니다. – Tsundoku