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