计算Java的递归调用数

计算Java的递归调用数,java,string,recursion,char,Java,String,Recursion,Char,所以我对Java有点陌生,目前正在uni上一堂CS简介课。我有一个小问题困扰了我好一阵子。我需要编写一个递归方法,使用“游程编码(RLE)”算法“解压缩”输入文本。简单地说,如果输入为“QWWweeerTyyyyyQQQQweerTTT”,则输出必须为“q9w5e2rt5y4qw2Er3T”。目前,我的方法将输入分解为一个没有数字的字母(qwertyqwErT) 我的问题是,我怎样才能递归地计算字母的数量?我不允许在方法之外声明任何变量,这是我的主要问题,因为我在Stackoverflow上搜索

所以我对Java有点陌生,目前正在uni上一堂CS简介课。我有一个小问题困扰了我好一阵子。我需要编写一个递归方法,使用“游程编码(RLE)”算法“解压缩”输入文本。简单地说,如果输入为“QWWweeerTyyyyyQQQQweerTTT”,则输出必须为“q9w5e2rt5y4qw2Er3T”。目前,我的方法将输入分解为一个没有数字的字母(qwertyqwErT)

我的问题是,我怎样才能递归地计算字母的数量?我不允许在方法之外声明任何变量,这是我的主要问题,因为我在Stackoverflow上搜索的所有问题大多使用“全局变量”。但是,我可以声明任意多的局部变量

教授也给了我们一个“提示”:

提示#1:请记住,字符由数字代码表示。可以按如下方式递减字符变量:

字符c='7'; c--;//c现在将保留字符“6”

我试图通过在我正在处理的输入的末尾添加一个编号字符,每次有重复字符时递增,然后在有新字符时将其替换到前面,但这也不起作用

谢谢你的帮助

编辑:


我可能应该包括这样一个事实:我不允许使用任何类型的循环,并且我可以假设一个字符不会重复自身超过(9)次。全局变量确实是一件需要避免的事情。幸运的是,您完全不需要它们来实现纯功能,即RLE压缩

提示允许您直接使用数字(字符)作为计数器。考虑这个片段:

char c = getNextChar();
if (Character.isDigit(c)) {
  counter = c;
  char_to_decompress = getNextChar();
  while (c > '0') {
    result.add(char_to_decompress);
    c--; // the 'trick'
  } 
}
当然,只有在运行长度不超过9个字符的情况下,这才有效

WRT递归,除了替换外部循环之外,我看不到使用它的好方法。(可以用递归表示的任何内容都可以用循环表示,反之亦然。)

当然,这不是一个经验丰富的Java开发人员会做的,因为剪切和添加字符串非常慢,您必须使用
StringBuffer
来收集结果,并使用
CharSequence
作为输入,以允许廉价的字符串切片


但总体思路仍然存在。在字符串是列表的语言中,这种算法看起来会更好,切割列表的头部是一种自然操作,递归是表示循环的基本方式。当/如果您了解了Lisp、Haskell或Erlang等语言,您会更清楚地看到这一点

假设使用递归函数调用的返回值返回压缩字符串,则可以创建另一个参数来跟踪函数被调用的次数。通过使用引用变量,它可以充当该方法调用的某种“全局变量”

public String compress(..., Integer callCount) 
{
    callCount++;

    ...
}
然后从调用函数中执行类似的操作

Integer callCount;
compress(..., callCount);
System.out.println("Compressed in " + callCount + " iterations");
当然,由于您需要函数本身中的值来添加字符的重复次数,因此没有什么可以阻止您在函数中使用
callCount


另一个选项是使用静态变量,这类似于使用全局变量。

输入字符串不包含数字。
Integer callCount;
compress(..., callCount);
System.out.println("Compressed in " + callCount + " iterations");