【问题标题】:Just a little recursion issue in Java只是Java中的一个小递归问题
【发布时间】:2011-07-27 19:27:10
【问题描述】:

我目前正在解决一些递归问题,但我目前被困在一个问题上。

问题是递归地将空格插入到字符串中,插入到每个可能的位置,使得输出看起来像这样:

Input: ABCD
Out:
       ABCD
       A BCD
       A B CD
       A B C D
       A BC D
       AB CD
       AB C D
       ABC D

我目前已经解决了这个问题,并且达到了一个类似的点:

Input: ABCD
Out:
       ABCD
       A BCD
       A B CD
       A B C D

到目前为止我的问题代码:

import java.util.Scanner;

public class Words 
{
    static int counter = 0;
    static String fString = "";
    static String fString2 = "";
    static String previous = "";
    static String input = "";
    static String other = "";

    public static String segment(String inputPrefix, String restOfString)
{
    if(restOfString.length() != 0)
    {   
        if(inputPrefix.equals(""))
        {
            fString += restOfString + "\n";
            segment(restOfString.substring(0,1), restOfString.substring(1));
        }
        else
        {
            previous += inputPrefix + " ";
            fString += previous + restOfString + "\n";
            fString2 = previous + restOfString;
            segment(restOfString.substring(0,1)
                            , restOfString.substring(1));
        }
    }
    /*else
    {
        counter++;
        other = fString2.replaceAll(" ", "");
        System.out.println(other);
        if((counter + 1) < other.length())
        {
            System.out.println("Other: " + other);
            input = other.substring(0, counter + 1);
            other = other.substring(counter + 1);
            System.out.println(counter);
            System.out.println("input: " + input);
            System.out.print("other: " + other);

            segment(input, other);
        }
        else
            return fString;
    }*/

    return fString;

}

public static void main (String[] args) 
{
    Scanner scan = new Scanner(System.in);
    System.out.print("Enter a string: ");
    String input = scan.next();
    System.out.println();
    System.out.println(segment("", input));

}
}

第二个 else 子句是我最麻烦的地方,因为每次我在未注释的情况下运行它时,它都会进入无限循环。我什至放了 int trace 语句(println 语句),但它仍然没有帮助。

我已经通读了很多遍,但我不明白为什么它不起作用。

【问题讨论】:

  • +1 个很好的家庭作业问题示例。显示到目前为止的代码以及问题的确切部分。
  • 当我想要一个递归解决方案时,它可以帮助我思考“程序必须做什么”而不是“程序将如何做”。
  • +1 一直在寻找体面的程序化大脑锻炼!
  • 输出字符串的列出方式可以提示你如何递归
  • 我赞同 Soronthar 的观点。 A B C D 是直观的,但之后的逻辑是什么?我知道对于没有得到它的人(我)很难用语言来解释:)

标签: java recursion


【解决方案1】:

首先让我怀疑你的代码是你应该返回一系列字符串,但你的返回值是一个字符串。

也许,您应该确定基本情况和递归步骤。

看起来您已经开始使用基本案例了。你可以在空字符串中插入零个空格,所以

allPossibleSpacings("") -> [ "" ]

但你不想在末尾插入空格,所以你需要第二个基本情况

allPossibleSpacings("x") -> [ "x" ]

然后你的递归步骤可能是

allPossibleSpacings("x" + s) -> flatten(
    ∀ t : allPossibleSpacings(s), ["x" + t, "x " + t])

我不会帮助你用 Java 编写它,因为它是家庭作业,但希望对你有所帮助。

【讨论】:

  • 如果不使用 TeX 之类的东西,我不知道 ∀ 符号的存在......太棒了!
  • @Michael McGowan,unicode page 22xx 有各种方便的数学符号。 unicode.org/charts/PDF/U2200.pdf
  • 这种符号语言叫什么?
  • @hini 哪种表示法?我混合了不同的符号,所以它有点伪代码。 “->”表示reduces to,但我可能应该使用粗箭头。 “∀”是universal quantifier。然后我使用方括号来分隔不是 Java 风格的数组。
【解决方案2】:
void recurse(String myString, int start){
        System.out.println(myString);
        for(int i = start; i < myString.length; i++) {
            if (myString.charAt(i) != ' ' ){
                recurse(myString.Substring(0,i) + ' ' + myString.Substring(i), i+2);
            }
        }
    }

首先调用递归("ABCD", 1);

【讨论】:

  • -0.5 作业的重点是学会思考问题,而不是为你提供答案。
  • 我就是喜欢解决这样的事情:(
  • @Jean-BernardPellerin 如果我需要做一些不同的事情,我会得到一个未知长度的字符串,并且需要插入长度为 6 的字符串。例如,如果我得到 ABCD,我可以插入 BCD(A 后 2 个空格)或 BCD(A 后 1 个空格)
  • @Dejel,作为问题提出,评论回复太长了
【解决方案3】:

看起来您已经能够正确地进行第一个“分组”,但无法获得下一个分组。

分组是:“A BCD”、“AB CD”和“ABC D”。您需要将您的算法应用于这些分组中的每一个。您已将其应用于第一个。其余的如何获得?

时间够用了吗?我编写了一个 python 解决方案,只是为了看看它与 Java 相比会是什么样子。

def segment(input, separator=' ', start_from=0):
    print input
    # add spaces after each letter starting from start_from index, terminating at last letter-1
    for i in range(start_from, len(input)-1):
        # if the next letter is already a space, or this letter is a space, move on
        if separator in (input[i+1], input[i]): continue
        # whatever index we're on, do the next one recursively
        segment(input[:i] + input[i] + separator + input[i+1:], separator=separator, start_from=i+1)

segment('ABCD')

【讨论】:

  • 如果我想放多个空格怎么办?例如,如果我得到 ABCD,我可以放 A BCD(2 个空格)
  • @Dejel 注意到 separator 参数了吗?只需制作两个空格而不是一个。即:segment('ABCD', separator=' ').
  • 我的意思是玩 - 一次放置一个空格,另一次将分隔符放置为 2 个空格
  • @Dejel 您需要在for 循环中使用一些逻辑来更改下一个递归步骤的分隔符。
猜你喜欢
  • 1970-01-01
  • 2011-08-01
  • 2010-12-09
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 2017-11-15
  • 1970-01-01
相关资源
最近更新 更多