使用三种预先给定的方法反向打印字符串?

时间:2016-11-21 22:10:46

标签: java string recursion methods

我需要使用三种预先给定的方法printBackwards()firstrest编写length方法。 printBackwards()方法需要将String作为参数并在控制台上打印该字符串的每个字母,但每个字母都需要在新行上以相反的顺序打印。因此,如果String为House,则输出应为:

电子
小号
ü
Ø
H

在本练习中,我们应该使用递归和if-else语句。没有数组,没有其他(熟悉的)String方法,没有while和for循环。

我做了一点,我知道这不正确,但那就是我设法做了多少。我不明白如何编写代码,因此该方法可以在字母e之前返回字母。 如何在这里使用递归?

public class Recurse {

    public static void main(String args[]){

        System.out.println(printBackwards("House"));

    }

    //printBackward: takes a String as a parameter and prints letters of the String, 
    // one on each line, but backwards
    public static String printBackwards(String s){
        if (length(s) == 1){
            return s;
        } else {
            return printBackwards(rest(s));
        }   
    }   


    // first: returns the first character of the given String
    public static char first(String s) {
        return s.charAt(0); 
    }

    // last: returns a new String that contains all but the
    // first letter of the given String
    public static String rest(String s) {
        return s.substring(1, s.length());
    }

    // length: returns the length of the given String
    public static int length(String s) {
        return s.length();
    }
}

2 个答案:

答案 0 :(得分:3)

因为这是一个家庭作业问题,我会尽可能多地离开你,所以你学习

考虑以下两个事实:

  1. 您必须在打印休息后打印第一个字符
  2. 如果字符串为空,则不打印任何内容
  3. 使用这两个事实足以构建一个递归方法。

    第2点是终止条件。最好先编码。
    第1点是主要的方法体,其中使用递归

    打印其余

    一旦有了终止条件和递归结构(通常是预订或后订单操作),就可以构建一个递归方法。

    还请注意打印 Backwards()方法的名称(不是向后())。也就是说,方法进行打印;它没有向后返回字符串。

    因此,将上述内容转换为伪代码(在本例中实际上是 代码):

    1. 如果字符串为空则不执行任何操作
    2. 使用字符串的其余部分调用self
    3. 打印第一个字符

答案 1 :(得分:1)

首先,您需要在printBackwards函数中打印输出,因此main将如下所示:

public static void main(String args[])
{
    printBackwards("House");
}

其次,递归的工作方式。如果您希望以升序执行它,您应该在自我函数调用之前执行操作。否则,在执行顺序下降的情况下,您应该在自我调用函数之后执行代码。这些是递归函数的基本原理。

在这种情况下,让我们尝试建立答案 首先,我们需要处理停止条件,该条件应始终写在之前自调用函数。最好和最常见的停止条件是到达某事的结尾,在这种情况下,当我们得到一个空字符串时,在所有其他情况下,我们需要稍微改变一下调用自我函数,在这种情况下它将为函数提供其余的字符串:

if ( !length(s) )
{
    //stop the recursion
    return;
}
else 
{
    printBackwards(rest(s));
}

当你到达stop recursion语句时,从这一点开始,它将关闭所有打开的自我执行功能,因此将向后移动。
这是我们需要实现的完美状态,向后打印字母,因为在printBackwards执行的每个状态,我们从左侧字母切了一点字符串,这意味着第一个字母是我们需要的。
例如,对于字符串HouseprintBackwards函数的最后一次调用将在s变量保存e值时,因为它是一个源自当我们达到停止状态时,被切断为空字符串。在这种情况下,我们希望将其打印出来,但在此之前的自我调用中,s变量将保留值se,因为它在剪切第一个字母之前是一步。所以,我们不想打印整个值,而只打印它的第一个字母,如下所示:

System.out.println(first(s));

将所有内容组合在一起将导致以下实施:

public static String printBackwards(String s)
{
    if ( !length(s) )
    {
        //stop the recursion
        return;
    }
    else 
    {
        printBackwards(rest(s));
        System.out.println(first(s));
    }
}

希望,我清楚地解释了。

祝你好运!