已解决:如何使用递归函数实现内置函数.eval()

问题描述 投票:3回答:3

Hei Coders,

我有一个字符串“ 1 + 1”,使用javascript内置函数eval()我可以执行eval(“ 1 + 1”),所以返回值为2

但是如果我想在javascript中将这个概念实现为递归函数呢?

function evaluate(str) {

}

evaluate("1+1");
evaluate("1-1");
evaluate("1*1");
evaluate("1/1");

我尝试过的是

function evaluate(str) {
  if (str.length === 0) {
    return "";
  }else{
    let angka;
    let symbol;
    for (let i = 0; i < str.length; i++) {
      if (isNaN(str[i])) {
        symbol = str[i];
        break;
      }else{
        angka = str[i]; 
      }
    }
    switch (symbol) {
      case "+": 
        return angka + evaluate(str.slice(1));
      case "-":
          return angka - evaluate(str.slice(1));
      case "/":
        return angka / evaluate(str.slice(1));
      case "*":
        return angka * evaluate(str.slice(1));
      default:
        return parseInt(str[0]) + evaluate(str.slice(1));
    }
  }
}

function evaluate(str) { 
  if (str.length === 0) {
    return ""
  }

  let numbers = "";
  let operator = "";
  let lastIndex = 0;
  for (let i = 0; i <= str.length; i++) {
        if (!isNaN(parseInt(str[i]))) {
          numbers += parseInt(str[i]);          
        }else{
          operator = str[i];
          lastIndex = i;
          break;
        }
  }

  // console.log(numbers, " " , operator , " " , lastIndex);
  lastIndex  = lastIndex < 1 ? 1 : lastIndex;
  if (operator === "+") {
    return numbers + evaluate(str.slice(lastIndex));
  }
}

function evaluate(str) {
  if (str.length === 0) {
    return 1;
  }else{
    let numbers = "";
    for (let i = 0; i <= str.length; i++) {
      if(parseInt(str[i]) >= 0){
        numbers = numbers + "+" +  str[i];
      }else{
        let lengthNumbers = numbers.length > 1 ? numbers.length : 1;
        let tempNumbers = numbers;
        numbers = "";
        return tempNumbers + evaluate(str.slice(lengthNumbers))
      }
    }
  }
}

============

更新

我是多么不高兴:),目前这是我的答案(根据下面的解决方案,谢谢大家)>

function evaluate(str) {
 if(str.match(/[*/+-]/)){
   let numbers = "";
   for (let i = 0; i < str.length; i++) {
     switch (str[i]) {
       case "+":
        return parseInt(numbers) + evaluate(str.slice(numbers.length+1))     
      case "*":
          return parseInt(numbers) * evaluate(str.slice(numbers.length+1))       
      case "/":
          return parseInt(numbers) / evaluate(str.slice(numbers.length+1))       
      case "-":
          return parseInt(numbers) - evaluate(str.slice(numbers.length+1))       
      default:
        numbers += str[i];
        break;
     }     
   }
 }else{
   return parseInt(str[0]);
 }

}
console.log(evaluate('1+2+3+4+5')) // 15
console.log(evaluate('1*2*3*4*5')) // 120
console.log(evaluate('20/4')) // 5
console.log(evaluate('20-6')) // 14

没有人工作!我知道eval会节省我的时间,但是在这种情况下,我需要解决此问题,谢谢。

Hei Coders,我有一个字符串“ 1 + 1”,使用javascript内置函数eval()我可以执行eval(“ 1 + 1”),所以返回值为2,但是如果我要实现此功能,该怎么办?递归的概念...

javascript function recursion eval evaluate
3个回答
1
投票

尝试此代码


2
投票

另一种方法是将您的字符串转换成可以作为堆栈进行评估的数组,然后对该堆栈进行简单评估。例如,我们可以将"10 - 20 + 30 * 2 / 10"变为[10, 20, "-", 30, "+", 2, "*", 10, "/"],然后通过将栈顶的两个元素依次替换为当前操作的值来对其求值。


1
投票

你非常亲密。它需要更复杂一些。

© www.soinside.com 2019 - 2024. All rights reserved.