以递归方式添加到java中的字符串

时间:2013-06-01 01:44:15

标签: java string recursion

我正在尝试将int 123转换为String" CBA"在java中

我知道我在递归中有一些被误解的东西

在许多println语句之后,我知道这一点

ss将会是" CBA"

然后它将返回" CB"和" C"

我知道递归会像这样工作,但我不知道如何解决它

任何人都可以帮我处理代码,谢谢!

public String recur ( int x, String ss )
{
    if ( x >= 1 && x < 10 )
        ss = ss + "A";

    if ( x >= 10 && x < 100 )
    {
        ss = ss + "B";
        recur( x % 10, ss);
    }

    if ( x >= 100 && x < 1000 )
    {
        ss = ss + "C";
        recur( x % 100, ss);    
    }
return ss;          

3 个答案:

答案 0 :(得分:1)

您忽略了recur的返回值,因此只有在输出处才能看到第一级递归。

所以你可以这样做来考虑返回值。 (只需将recur的输出分配给ss)

ss = recur( x % 10, ss);

和另一个电话。

ss = recur( x % 100, ss);

答案 1 :(得分:0)

你的方法不正确,对于初学者来说,你甚至不需要传递一个字符串作为参数 - 只需在返回值中构建字符串。此外,从整数转换为字符串的逻辑过于复杂,如果整数按照确切的顺序包含数字1, 2, 3,则有效!这是一种更简单,有效的方法,可以依次处理每个字符,适用于任何数字的整数:

public String recur(int x) {
    if (x <= 0)
        return "";
    return (char) (x % 10 + 'A' - 1) + recur(x / 10);
}

说明:

  • 当整数等于或小于零时出现基本情况,在这种情况下我们必须返回一个空字符串
  • 递归步骤的工作原理如下:
    • 我们通过取余数x % 10从整数中获取当前数字,并通过添加'A'并减去1
    • 将数字转换为大写字母
    • 我们将前一个结果与推进递归的结果相连接,将整数除以10

答案 2 :(得分:0)

(本答案主要针对花生画廊......)

这是我对问题的“最佳”递归解决方案的看法:

public String recur ( int x )
{
    if ( x >= 1 && x < 10 ) {
        return "A";
    } else if ( x >= 10 && x < 100 ) {
        return "B" + recur( x );
    } else if ( x >= 100 && x < 1000 ) {
        return "C" + recur( x );    
    } else {
        throw new IllegalArgumentException();
    }
}

System.err.println(recur(123));

或更普遍:

public String recur ( int x)
    return recur0( x, 0 );
}

public String recur0 ( int x, int i )
{
    if ( x <= 0 ) {
        return "";
    else {
        return recur0( x % 10, i + 1 ) + ((char) ('A' + i));
    } 
}

System.err.println(recur(123));

如您所见,不需要StringBuilder。最好的情况是,StringBuilder是一种微优化。它不会使代码更安全,也更可读。为了说明,这是使用StringBuilder重做的第一个版本

public void recur ( int x, StringBuilder sb )
{
    if ( x >= 1 && x < 10 ) {
        sb.append("A");
    } else if ( x >= 10 && x < 100 ) {
        sb.append("B");
        recur( x, sb );
    } else if ( x >= 100 && x < 1000 ) {
        sb.append("C");
        recur( x, sb );    
    } 
}

StringBuilder sb = new StringBuilder();
recur(123, sb);
System.err.println(sb.toString());

但最初提出的问题最简单的解决方案是:

public String nonRecur(int x) {
    if ( x >= 1 && x < 10 ) {
        return "A";
    } else if ( x >= 10 && x < 100 ) {
        return "BA";
    } else if ( x >= 100 && x < 1000 ) {
        return "CBA";    
    } else {
        throw new IllegalArgumentException();
    }
}

System.err.println(nonRecur(123));

请注意,问题陈述的方式存在相当大的模糊性,@ÓscarLópez的解决方案基于对问题的不同的解释而不是我的解释。他将数字的数字映射到字母,而不是使用字母来表示幅度。

事实上,OP的实际问题既不是这些解释,我认为任何答案都不会真正帮助他......即使他们确实回答了他的问题。 / p>