有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java语义理解递归反向字符串返回语句

目前我对递归越来越熟悉,为了进一步理解它,我想在反转字符串的上下文中研究它。我知道它没有使用StringBuffer那么有效,但就像我说的,这主要是为了帮助更好地理解。我知道有一些问题,所以关于这一点,但我想在演练中得到一些帮助

                 return reverse(str.substring(1)) + str.charAt(0);

此场景中的字符串=“开始”

我知道substring方法使用的是没有第一个字符的子字符串

递归调用。(部分)

reverse("Start")
reverse("tart")
reverse("art")
reverse("rt")
reverse("t") // when string is 1 char length then the reverse string is returned

但我想了解一下在递归演练中它是如何连接和重建字符串的

提前谢谢


共 (2) 个答案

  1. # 1 楼答案

    对于递归,最好考虑有一个基本情况和一个递归调用

    我猜你有这样的想法:

    public String reverse(String str){
        if (str.length() == 0) 
             return str;
    
        return reverse(str.substring(1)) + str.charAt(0);
    }
    

    最后的返回调用只是从字符串中提取第一个字符,并将其连接到reverse的递归调用。因此,逐渐变短的字符串的第一个字符总是被追加到字符串的末尾,即被颠倒

    与其考虑递归的每个阶段,不如只看基本情况和递归调用。使用归纳的过程,你可以确定递归会起作用

    事实上,我认为在这种情况下,从一个包含3个字符的字符串开始,例如“str”,可以更容易地看到发生了什么。如果有效,它将适用于所有情况(这是归纳法)

  2. # 2 楼答案

    声明

    return reverse(str.substring(1)) + str.charAt(0);
    

    表示“反转最后的n-1个字符,并将第一个字符移到末尾”(其中字符串的长度为n)。如果您考虑一下,通过以下方式跟踪递归调用,这是有意义的:

    reverse("tart") + "S"
    (reverse("art") + "t") + "S"
    ((reverse("rt") + "a") + "t") + "S"
    (((reverse("t") + "r") + "a") + "t") + "S"
    ((((reverse("") + "t") + "r") + "a") + "t") + "S"
    

    假设在剩下一个空字符串时有一个合适的停止条件,方法调用现在会逐个返回:

    (((("t") + "r") + "a") + "t") + "S"
    ((("tr") + "a") + "t") + "S"
    (("tra") + "t") + "S"
    ("trat") + "S"
    "tratS"