Recursion 递归:一种方法,它接受一个字符串,对于字符串中的每个重复字符序列,除去其中一个以外的所有字符

Recursion 递归:一种方法,它接受一个字符串,对于字符串中的每个重复字符序列,除去其中一个以外的所有字符,recursion,Recursion,完成以下获取字符串的方法,对于字符串中的每个重复字符序列,除去其中一个以外的所有字符。例如,给定输入字符串“aaaabccddddaaccccc”,该方法应返回“ABCDAC” 您的代码必须是递归的。不要使用任何循环(while、Do/while或for)。不要在方法之外声明任何变量。您可以在方法内声明局部变量 public static String eliminateRepeats (String s) { 这里的诀窍是你需要一个循环来解决这个问题,所以你只要通过用字符串中越来越小的部分递

完成以下获取字符串的方法,对于字符串中的每个重复字符序列,除去其中一个以外的所有字符。例如,给定输入字符串“aaaabccddddaaccccc”,该方法应返回“ABCDAC”

您的代码必须是递归的。不要使用任何循环(while、Do/while或for)。不要在方法之外声明任何变量。您可以在方法内声明局部变量

public static String eliminateRepeats (String s)
{

这里的诀窍是你需要一个循环来解决这个问题,所以你只要通过用字符串中越来越小的部分递归调用这个方法来伪造一个循环

没有办法将工作分成更小的部分,就像使用递归时通常所做的那样(例如,将字符串一分为二)。您只需一次处理一个字符,然后用字符串的其余部分调用该方法

C#中的示例:

(代码灵感来源于Jonathan Paynes代码。)

以下是一个递归变体:

@tailrec 
def concentrate (s: String, carry:String = "", lastchar: Char = 0) : String = {
    if (s.length == 0) carry else 
    if (s(0) == lastchar) concentrate (s.substring (1), carry, lastchar) else 
    concentrate (s.substring (1), carry + s(0), s(0)) }

它将递归调用放在最后一个位置,因为生成的字符串会动态地粘在一起,并作为参数传递。在Scala中,编译器可以对其进行优化,使其运行速度几乎与具有可变变量的循环一样快,并且不会破坏堆栈—即使对于非常长的字符串也是如此

@Tudor他的“public static String eliminateRepeats(String s)”是java。@JonathanPayne:也可以是C#,但根据类型和方法名的大写,java的可能性稍大一些。这不是一个很好的赋值,因为这实际上需要一个循环。因此,您正在学习如何使用递归来伪造循环,而不是学习如何正确使用递归。@Guffa:循环只是伪造递归的一次拙劣尝试。@userunknown:Hehe。。。但说真的,在这种情况下,正确的循环将是更好的实现。它将创建更少的中间对象,速度更快,并且可以处理巨大的字符串,因为它不受堆栈空间的限制。这是可行的,但是您使用输出缓冲区作为全局变量,而不是返回结果,所以它不符合作业的要求。我不明白为什么人们总是在没有被要求的情况下提供“ignoreCase”。@userunknown:如果需要的话,这很容易解决。将
==1
更改为
<2
。为什么要投否决票?如果你不解释你认为答案有什么问题,它就无法改善它。
public static string EliminateRepeats(string s) {
  return
    s.Length == 1 ?
      s
    :
      (s[0] != s[1] ? s.Substring(0, 1) : "")
      + EliminateRepeats(s.Substring(1));
}
// use a default value for the lastchar for the first char, 
// which is impossible to meet in an regular string
def concentrate (s: String, lastchar: Char = 0) : String = {
    // recursive methods always need to know when it is enough
    if (s.length == 0) s else 
    if (s(0) == lastchar) concentrate (s.substring (1), lastchar) else 
    s(0) +  concentrate (s.substring (1), s(0)) }

concentrate ("AAAABCCDDDDAACCCCCC")
@tailrec 
def concentrate (s: String, carry:String = "", lastchar: Char = 0) : String = {
    if (s.length == 0) carry else 
    if (s(0) == lastchar) concentrate (s.substring (1), carry, lastchar) else 
    concentrate (s.substring (1), carry + s(0), s(0)) }