我在C和Lisp算术计算器中制作一个简单的程序,只涉及整数和"+ - * /"运算符,我这样做是为了学习目的,这不是我的作业或类似的东西.
所以我已经创建了一个函数,它将正确地解析这样(+ 2 3)输出5的东西,所以我知道如何处理非嵌套语句,但是当我有这样的东西时,我觉得(+ (* 2 3) (- 4 2))我可以使用递归来解决这个问题,但我不知道我不知道该怎么做.
我的逻辑是(伪代码):`
function parse_line(int n)
get_input(string);
if string[n] == '('
if string[n+1] == operator
if string[n+3] == number
result = parseAllNumbers(); //between ( )
return result;
if string[n+3] == '('
parse_line(n+2);
Run Code Online (Sandbox Code Playgroud)
`
所以我的逻辑在这里是正确的,如果我有,(+ (* 2 3) (- 4 2))我只会计算.(* 2 3),我将如何计算(- 4 2),然后将这两个结果加在一起
你肯定是在正确的轨道上.
假设我们getToken()编写了一个函数,它从当前位置读取字符串中的下一个逻辑标记.逻辑令牌可以是数字,'(',')'或四个运算符中的任何一个.然后我们可以递归计算表达式.
function evaluateExpression(){
var token = getToken();
if( isNumber(token)){
return token;
}else if( isOpenParen(token)){
return evaluateExpression();
}
var numOne = evaluateExpression();
var nextToken = null;
while( !isRightParen(nextToken)){
nextToken = getToken();
numOne = evaluate(token, numOne, nextToken);
}
return numOne;
}
Run Code Online (Sandbox Code Playgroud)
函数isNumber()并isLeftParen()执行它们所暗示的函数,如果传递给它的标记分别是数字或左括号,则返回true.该evaluate()函数接受运算符令牌以及两个数字来评估它们.例如,evaluate(+,2,4)将返回6和evaluate(-,2,4)将返回2.