Java 如何逐字母递归打印字符串,每个字母之间有一个星号?

Java 如何逐字母递归打印字符串,每个字母之间有一个星号?,java,recursion,Java,Recursion,我需要一个字母一个字母地打印一个字符串,每个字母之间有一个*号。 我想找到一个递归的解决方案,而不是迭代的。签名必须是: 公共静态字符串allStarString a; 尝试这样做,首先将字符串拆分为每个字符的字符串数组,然后用*字符连接在一起 System.out.println(String.join("*", a.split(""))); 全星级{ 公共静态字符串allStarString a{ 返回allStar0,a; } 公共静态字符串al

我需要一个字母一个字母地打印一个字符串,每个字母之间有一个*号。 我想找到一个递归的解决方案,而不是迭代的。签名必须是:

公共静态字符串allStarString a;
尝试这样做,首先将字符串拆分为每个字符的字符串数组,然后用*字符连接在一起

System.out.println(String.join("*",  a.split("")));
全星级{ 公共静态字符串allStarString a{ 返回allStar0,a; } 公共静态字符串allStarint ch、字符串a、字符串res{ ifa.length==0{ 返回res; } ifch==a.length-1{ res+=a.charAtch; 返回res; } 否则{ res+=a.charAtch+*; 返回所有淀粉+1,a,res; } } 公共静态字符串参数[]{ System.out.printlnalstararitro; } } 说明:


我们在ch参数中传入起始字符索引。a接受根据指定格式打印的字符串,即带有星星的字符串。res接收应该存储结果的字符串。if语句检查该字母是否为最后一个字母。如果为true,它只是将不带星号的字母附加到res字符串,因为它指定星号应位于字母之间。它还返回存储在res中的格式化字符串。如果它不是最后一个字母,则ch递增,原始字符串按原样传递,格式化字符串也传递。这将一直持续到最后一个字符。

贝沙姆贝的答案是一个简洁而简单的方法。但如果您想递归地执行此操作,则:

公共静态字符串allStarString a{ ifa==null | | a.isEmpty{ 回来 } ifa.length==1{ 返回a; } 返回a.charAt0+*+allStara.substring1; } 递归打印字符串的解决方案

递归生成字符串的解决方案

为了减少堆污染,这是递归字符串构建的最佳选择

不推荐使用递归的解决方案,但可用于此任务。

请尝试以下代码:

public class Main {

static String Answer = "" ;


    public static void main(String[] args) {

        Main.SetStarAfterEachLetter("hello!");

        System.out.println(Answer);

    }


public static void SetStarAfterEachLetter(String letter){

    Answer = Answer + letter.charAt(0);
    Answer = Answer + " * ";
    letter = letter.substring(1);

    if(!letter.isEmpty()) {
        SetStarAfterEachLetter(letter);
    }
}

}

使用重载函数addStarString str和addStarint pos,String str的示例实现:

测验

System.out.printlnaddStarnull; System.out.println'+addStar+'; System.out.printlnaddStara; System.out.printlnaddStarab; System.out.printlnaddStarabcd; 输出

null
''
a
a*b
a*b*c*d

这是更一般的答案:

import java.util.Scanner;
公共班机{

static String Answer = "" ;


    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        
        String word = scanner.nextLine();

        Main.SetStarAfterEachLetter(word);

        System.out.println(Answer);

    }


public static void SetStarAfterEachLetter(String letter){

    Answer = Answer + letter.charAt(0);
    Answer = Answer + " * ";
    letter = letter.substring(1);

    if(!letter.isEmpty()) {
        SetStarAfterEachLetter(letter);
    }
}

递归原理:将问题分解为charAt0,子字符串1处理简单部分,对另一部分再次使用该函数,不要忘记结束条件length==1String.join是迭代的,而不是递归的。在这种情况下,另一个答案将是正确的。您的解决方案不会将空字符串作为输入处理。的签名功能全明星是given@CostiCiudatu已编辑。@Turo此版本不依赖太多内置功能,这是许多教育场景的要求。刚刚提到此版本,以便如果任何人想要使用不使用太多内置功能的解决方案,这可能会很方便。然后将其设为两个功能,即公共全明星作为你的私人,请看@AlexRudenko的回答。这是一个很好的例子,确保null和:-根据问题陈述,我认为使用isBlank而不是isEmpty会产生错误的结果。两个空格应该变成*,而不是@CostiCiudatu Yes。用注释更新它。我的意思是永远不要使用a.isBlank。在这种情况下,你的注释是请注意:对于isBlank,您将忽略尾随空格,但不忽略前导空格。最后一个注意事项:ifa.length==1{return a;}应该足够了。或者对于Java 8或更高版本,您可以使用streams a.chars.forEachc->System.out.printchar c++*这是Java 9或更高版本。此解决方案在最后一个字符后添加*是不理想的。可以改为使用a.chars.mapToObjCharacter::toChars.mapString::valueOf.collectCollectors。加入*是的,您是对的,最后一个星号是do不需要。我已经更新了我的代码。
public class Main {

static String Answer = "" ;


    public static void main(String[] args) {

        Main.SetStarAfterEachLetter("hello!");

        System.out.println(Answer);

    }


public static void SetStarAfterEachLetter(String letter){

    Answer = Answer + letter.charAt(0);
    Answer = Answer + " * ";
    letter = letter.substring(1);

    if(!letter.isEmpty()) {
        SetStarAfterEachLetter(letter);
    }
}
public static String addStar(String str) {
    if (null == str || str.isEmpty()) {
        return str;
    }
    return addStar(0, str);
}

static String addStar(int pos, String str) {
    if (pos == str.length() - 1) {
        return Character.toString(str.charAt(pos));
    }
    return str.charAt(pos) + "*" + addStar(pos + 1, str);
}
null
''
a
a*b
a*b*c*d
import java.util.Scanner;
static String Answer = "" ;


    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        
        String word = scanner.nextLine();

        Main.SetStarAfterEachLetter(word);

        System.out.println(Answer);

    }


public static void SetStarAfterEachLetter(String letter){

    Answer = Answer + letter.charAt(0);
    Answer = Answer + " * ";
    letter = letter.substring(1);

    if(!letter.isEmpty()) {
        SetStarAfterEachLetter(letter);
    }
}