Algorithm 如何在使用WHILE循环时递归调用函数并正确地中断它?

Algorithm 如何在使用WHILE循环时递归调用函数并正确地中断它?,algorithm,scala,Algorithm,Scala,我试图通过删除字母a和相邻字母B或删除字母C和相邻字母D来转换字符串 例如,给定一个字符串“CBACD”,它应该转换为 CBACD -> CCD -> C 示例2:给定一个字符串“CABABD”,它应该不返回任何内容,因为转换如下所示: CABABD -> CABD -> CD -> 示例3:“ACBDACBD”,A&C没有对应的相邻字符,因此应返回整个字符串 "ACBDACBD" -> "ACBDACBD" 我编写了以下代码来执行该操作: objec

我试图通过删除字母a和相邻字母B或删除字母C和相邻字母D来转换字符串

例如,给定一个字符串“CBACD”,它应该转换为

CBACD -> CCD -> C
示例2:给定一个字符串“CABABD”,它应该不返回任何内容,因为转换如下所示:

CABABD -> CABD -> CD -> 
示例3:“ACBDACBD”,A&C没有对应的相邻字符,因此应返回整个字符串

"ACBDACBD" -> "ACBDACBD"
我编写了以下代码来执行该操作:

object RemoveCharsABCD {

    val s = scala.io.StdIn
    def adjacent(s: String): String = {
        val charSet = ArrayBuffer("AB","BA","CD","DC")
        var i   = 0
        var ret:String = ""
        while(i < s.length-1) {
            if(charSet.contains(s"${s.charAt(i)}${s.charAt(i+1)}")) {
                s.slice(i+2, s.length)
                i += 2
                if(i == s.length-1) ret = s"$ret${s.charAt(i).toString}"
            } else {
                    ret = s"$ret${s.charAt(i).toString}"
                    i += 1
                    if(i == s.length-1) ret = s"$ret${s.charAt(i).toString}"
            }
        }
        println("Ret: " + ret)
        ret
    }

    def main(args: Array[String]): Unit = {
        println("Enter a String: ")
        var s = scala.io.StdIn.readLine().toString
        adjacent(s)
    }
}
但这将进入无限循环并给出
stackoverflow
异常。 我无法递归调用方法:
相邻
,以便它可以一直工作到字符串结束?
有没有人能告诉我如何正确地调用方法:nextering递归,以便处理整个字符串直到结束?

似乎非常简单

@annotation.tailrec 
def adjacent(s: String): String = {
  val next = s.replaceAll("AB|BA|CD|DC", "")
  if (s == next) s else adjacent(next)
}

adjacent("CBACD")     //res0: String = C
adjacent("CABABD")    //res1: String =
adjacent("ACBDACBD")  //res2: String = ACBDACBD

你有
s.slice(i+2,s.length)
,你不应该把它的结果赋给一个变量吗?如果我把它赋给'ret',输出是'CABABD'的'DD',我只是说行本身什么都不做,因此,您要么需要删除它,要么使用结果。在while循环的第一个“IF”中,我尝试使用它作为:I+=2解决方案(s.slice(I,s.length)),但我仍然看到CABABD->cdalway@jwvh的相同输出。答案很好,但我想先尝试一下,作为最后的手段,我将使用答案。
@annotation.tailrec 
def adjacent(s: String): String = {
  val next = s.replaceAll("AB|BA|CD|DC", "")
  if (s == next) s else adjacent(next)
}

adjacent("CBACD")     //res0: String = C
adjacent("CABABD")    //res1: String =
adjacent("ACBDACBD")  //res2: String = ACBDACBD