加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何递归地平衡括号

发布时间:2020-12-16 18:27:39 所属栏目:安全 来源:网络整理
导读:我正在研究一些代码来平衡括号,this question证明对算法最有用. 我用我的第一语言(PHP)实现它,但我正在学习Scala并尝试转换代码. 这是我的PHP代码: function balanced($string) { return isBalanced($string,"");}function isBalanced($chars,$stack) { if
我正在研究一些代码来平衡括号,this question证明对算法最有用.

我用我的第一语言(PHP)实现它,但我正在学习Scala并尝试转换代码.

这是我的PHP代码:

function balanced($string) {
  return isBalanced($string,"");
}

function isBalanced($chars,$stack) {
  if (!strlen($chars))
    return empty($stack);

  switch ($chars[0]) {
    case '(':
      // prepend stack with '(',move to next character
      return isBalanced(substr($chars,1),$chars[0] . $stack);
    case ')':
      // if '(' seen previously,shift stack,move to next character
      return !empty($stack) && isBalanced(substr($chars,substr($stack,1));
    default:
      // do nothing to stack,$stack);
  }
}

我测试了这个,它有效.但是,当我将其转换为Scala时,它在平衡字符串上失败.

我的Scala代码:

object Main {
  def balance(chars: List[Char]): Boolean = {
    def balanced(chars: List[Char],stack: String): Boolean = {
      if (chars.isEmpty)
        stack.isEmpty
      else if (chars.head == ')')
        balanced(chars.tail,chars.head + stack)
      else if (chars.head == '(')
        !stack.isEmpty && balanced(chars.tail,stack.tail)
      else
        balanced(chars.tail,stack)
    }

    balanced(chars,"")
  }
}

我很欣赏这不是最好的Scala代码,但我刚刚开始.一些测试:

balance("(if (0) false (x))".toList) - fails
balance("profit and loss (P&L).n(cashflow)".toList) - fails
balance(":)".toList) - passes
balance(")(()".toList) - passes

PHP等价物通过了所有这些测试.我在Scala实现中做错了什么?

解决方法

你混淆了(和)的案例.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读