Algorithm 如何在使用WHILE循环时递归调用函数并正确地中断它?
我试图通过删除字母a和相邻字母B或删除字母C和相邻字母D来转换字符串 例如,给定一个字符串“CBACD”,它应该转换为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
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