2011-10-10 2 views
3

학교에 문제가있어 혼란 스럽습니다. 기본적으로 클래스에서는 재귀에 대해 배우고 있습니다. 숙제와 상호 회귀에 대한 소개로서 상호 재귀를 사용하는 수학 식 평가자를 작성해야합니다. getExpressionValue, getTermValuegetFactorValue은 결과를 얻기 위해 서로를 호출해야합니다. 덧셈, 뺄셈, 곱셈, 나눗셈, 괄호 안의 표현을 지원해야합니다. 이 작업을 수행하는 방법에 대한 아이디어를 검색 할 때 반복적 인 하선 구문 분석을 계속합니다.하지만이 아이디어가이 문제에 적절한 지 확신 할 수 없습니다.Java 재귀 수학 표현식 평가

누군가가 나에게지도를 제공 할 수 있거나 이와 같은 구문 분석 방법을 설명하는 기사에 대한 링크를 제공 할 수 있다면 매우 감사하게 생각합니다. 감사.

+4

재귀를 이해하려면 먼저 재귀를 이해해야합니다. –

+2

[재귀?] (http://www.google.com.ng/search?hl=ko&sa=X&ei=zBOTTvuND5KGhQe43bj5Dw&ved=0CCEQBSgA&q=recursion&spell=1) – Mob

+2

@Mob Google에서 끝내주는 미친 아이들은 들썩 들썩합니다. –

답변

3

재귀 적 파싱이 실제로 적합합니다. The Wikipedia article on the subject에는 C의 멋진 예제가 포함되어 있습니다.

기본 아이디어는 다음과 같습니다. 주어진 텍스트가 유효한 표현이라고 가정하면 왼쪽 괄호 또는 숫자로 시작해야합니다. 따라서 첫 번째 문자를 살펴보면 괄호 안에있는 표현인지 여부를 알 수 있습니다. 그렇지 않은 경우 텍스트는 + 또는 -로 분리 된 하나 이상의 문구의 시퀀스 여야합니다. 그러면 텍스트의 시작 부분을 용어로 취급하기 시작합니다. 용어는 무엇입니까? * 또는 /로 구분 된 하나 이상의 요소의 시퀀스입니다. 그래서 당신은 텍스트의 시작을 하나의 요소로 다루기 시작합니다. 요인은 무엇입니까? 숫자 또는 괄호로 묶인 표현식이며, 첫 번째 문자를 보면서 그 문자를 판별 할 수 있습니다. 숫자 인 경우 숫자를 알아낼 수 있도록 모든 후속 숫자를 사용합니다. 이제 요소 값이 무엇인지 알아 내려고 시도한 메서드는이 값을 용어 값이 무엇인지 알아 내려고 시도하는 메서드에 반환 할 수 있습니다. 이 방법은 이제 첫 번째 숫자가 무엇인지 알고 있으며 다음 문자를 확인하여 * 또는/(편집 : 오른쪽 괄호, + 또는 a -이 될 수도 있음)를 확인할 수 있습니다. 단 하나의 숫자로 구성됨), 다음 요소를 추출하도록 요청하는 식으로 진행됩니다.

+1

그리고 강사가 재귀 적 파생 파싱에 대해 뭔가를 말했기를 바랍니다. 그리고 아마도 당신 책에있을 것입니다. -> –

+0

@Jeff 사실, 아니, 전혀. 우리는 책을 사용하지 않습니다. 조금 이상합니다. –

0

기본 아이디어는 수학적 표현이 더 작은 수학적 표현이라는 점입니다. 표현식을 더 작은 하위 표현식으로 나눌 수있는 함수 (또는 함수 집합)를 개발하고 그 하위 표현식을 이후 처리를 위해 전달합니다. 이 작업은 기본 요소 (이 경우 숫자 자체)로 완전히 분해 할 때까지 수행됩니다. 이 시점에서 기본 표현식을 평가하고 결과를 반환합니다. 값은 체인 체인의 위쪽에있는 전체 표현식에 대한 값을 생성하기 위해 호출 체인을 통해 퍼콜 레이트합니다. 당신은 아마있을 것이다 문제에

double getValue(expression){ 

    if(expression.isBasic) 
     return expression.LHS + expression.RHS 
    else 
     return getValue(expression.LHS) + getValue(expression.RHS) 
} 

트위스트가 아닌 하나 개의 함수는 자신을 호출하는 것입니다 4 또는 서로 전화 5 :

는 재귀는 다음과 같이 보인다. 어떤 함수가 호출되는지는 표현식에서 현재 처리중인 연산 (더하기, 곱하기, 나눗셈 등)에 따라 다릅니다.