2016-06-16 1 views
1

와 단순화 산술 식, 방금 변수없이 표현식을 단순화하기 위해 필요 :라켓 : 나는이 기능은 가능한 한 산술 식을 단순화 안됩니다</p> <pre><code>; (simplify expr) ; ; where expr is one of the following ; - a number ; - a symbol ; - a list of the form '(a operator b) where a and b are arithmetic expressions </code></pre> <p>기능을 구현하기 위해 노력하고 변수

예 :

,174 :

(simplify '(3 + a))     => '(3 + a) 
(simplify '(((2 + (3 * 4)) * a) + 2) => '((14 * a) + 2) 
(simplify '((2 + (3 - a)) * 2)  => '((2 + (3 - a)) * 2) 

는 이미 연산 식을 계산하는 기능을 구현

(define (eval t) 
    (cond 
    [(number? t) t] 
    [else ((cond 
      [(equal? (second t) '+) +] 
      [(equal? (second t) '-) -] 
      [(equal? (second t) '*) *] 
      [(equal? (second t) '/) /]) 
      (eval (first t)) (eval (third t)))])) 

이것은 내가 지금까지 가지고있는 것입니다. 그러나 그것이 제대로 작동하지 않는다는 사실 외에도 훨씬 좋은 방법이 있다고 생각합니다.

(define (simplify t) 
    (cond 
    [(number? t) t] 
    [(equal? 'a (first t)) `(,(first t) ,(second t) ,(simplify (third t))) ] 
    [(equal? 'a (third t)) `(,(simplify (first t)) ,(second t) ,(third t)) ] 
    [else ((cond 
      [(equal? (second t) '+) +] 
      [(equal? (second t) '-) -] 
      [(equal? (second t) '*) *] 
      [(equal? (second t) '/) /]) 
      (simplify (first t)) (simplify (third t)))])) 

어떤 도움을 주시면 감사하겠습니다!

답변

4

중요한 통찰력

(number operation number) 

가 그럼 결과를 찾기 위해 eval 기능을 사용 패턴 (number operation number)를 확인 단순화에 절을 추가

the result of evaluating (number operation number) 

로 단순화 할 수 있다는 것입니다.

+0

감사합니다. 목록에서 패턴 (숫자 연산 번호)을 확인하는 함수 (match-pattern? t)를 작성했으나 #true를 반환하면 전체 목록을 평가합니다 (match-pattern? t) (num op num) 표현식뿐 아니라 변수로 인해 오류를 반환합니다. 그 점에 대해 나에게 힌트를 줄 수 있니? (정의 (t 단순화) (COND [(번호? t) t] [(기호? t) t] [(대전 패턴? t) (평가 용 t)] [다른 t])) – newbie

+0

'(표현식 op 표현식)'을 처리하고 (단순화 표현식 op 단순 표현식)을 생성하는 추가 절이 필요합니다. – soegaard

관련 문제