【问题标题】:Printing String in reverse using three pre-given methods?使用三种预先给定的方法反向打印字符串?
【发布时间】:2017-04-05 10:43:04
【问题描述】:

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

e
s
u
o

在这个练习中,我们应该使用递归和 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();
    }
}

【问题讨论】:

  • 如果printBackwards“在控制台上打印该字符串的每个字母”,它不需要返回任何东西 - 让它成为void。你可能想在某个地方打电话给first。

标签: java string recursion methods


【解决方案1】:

因为这是一道作业题,我会尽量留给你,所以你学习。

考虑以下两个事实:

  1. 您必须在打印 rest 之后打印 first 字符
  2. 如果字符串为空,则不打印任何内容

使用这两个事实足以构建递归方法。

第 2 点是终止条件。最好先编写代码。
第 1 点是主要方法体,其中打印其余部分是使用递归完成的

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

还要注意方法printBackwards()(不是backwards())的名称。也就是说,方法进行打印;它不会返回字符串向后。

因此,将上述内容翻译成伪代码(在这种情况下实际上是 代码):

  1. 如果字符串为空,则什么也不做
  2. 用字符串的其余部分调用 self
  3. 打印第一个字符

【讨论】:

  • 我总是很难回答这样的问题。以伪代码回答的荣誉。
【解决方案2】:

首先你需要在printBackwards函数中打印输出,所以main看起来像这样:

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

其次,是递归的工作方式。如果你想让它按升序执行,你应该在 self 函数调用之前做一些事情。否则,如果执行顺序降序,您的代码应该在自调用函数之后执行。以上就是递归函数的基本原理。

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

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

当你到达 stop 递归语句时,从这一点开始,它将关闭所有打开的 self 函数执行,因此将向后退。
这是我们需要实现的完美状态,向后打印字母,因为在 printBackwards 执行的每个状态下,我们都将字符串从左边的字母切了一点,这意味着第一个字母是我们的需要。
例如,在字符串House 的情况下,最后一次调用printBackwards 函数将是当s 变量将保持e 值时,因为它是被截断为空字符串的一个原因,当我们达到停止条件时。在这种情况下,我们想将其打印出来,但在此之前的 self 调用中,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));
    }
}

希望,我解释清楚了。

祝你好运!

【讨论】:

  • 很好的解释!我明白了!
猜你喜欢
  • 2013-12-17
  • 1970-01-01
  • 2022-06-18
  • 1970-01-01
  • 2014-02-17
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多