java - Java中的意外递归行为
问题描述
public class Main21 {
static int count=0;
public static void printer(String s, int n, int sz){
if(n>sz-1)
return;
String s1=s+"P";
String s2=s+"A";
String s3=s+"L";
if(s1.length() == sz && s2.length() == sz && s3.length() == sz){
if( !s1.contains("AA") && !s1.contains("LLL") && !s2.contains("AA") && !s2.contains("LLL") && !s3.contains("AA") && !s3.contains("LLL") )
{
System.out.print(s1+" "+s2+" "+s3+" ");
count++;
}
}
printer(s1,n+1,sz);
printer(s2,n+1,sz);
printer(s3,n+1,sz);
}
public static void main(String[] args) {
int sz=2 ;
printer("P",1,sz);
printer("A",1,sz);
printer("L",1,sz);
System.out.println("\n"+count*3);
}
}
我得到结果:PP PA PL LP LA LL 6
AL 和 AP 被遗漏了。但是当我将尺寸传递为 3 时,它工作正常。你能指出错误吗?
通过 3 时:
PPP PPA PPL PLP PLA PLL APP APA APL ALP ALA ALL LPP LPA LPL 15
解决方案
我认为问题在于,当您检查字符串时,即使这三个字符串中只有一个无效,您也会跳过打印所有字符串。
这是可能的解决方案,它也删除了一些重复的代码:
public class Main21 {
static int count = 0;
public static void printer(String s, int n, int sz) {
if ( n > sz - 1 ) {
return;
}
String s1 = s + "P";
String s2 = s + "A";
String s3 = s + "L";
StringBuilder builder = new StringBuilder();
appendIfValid( builder, sz, s1, s2, s3 );
if ( builder.length() > 1 ) {
System.out.print( builder.toString() );
count++;
}
printer( s1, n + 1, sz );
printer( s2, n + 1, sz );
printer( s3, n + 1, sz );
}
private static void appendIfValid(StringBuilder builder, int sz, String... strings) {
for ( String s : strings ) {
if ( valid( sz, s ) ) {
builder.append( s );
builder.append( " " );
}
}
}
private static boolean valid(int sz, String s) {
return s.length() == sz
&& !s.contains( "AA" )
&& !s.contains( "LLL" );
}
public static void main(String[] args) {
int sz = 3;
printer( "P", 1, sz );
printer( "A", 1, sz );
printer( "L", 1, sz );
System.out.println( "\n" + count * 3 );
}
}
当字符串无效时,可以通过跳过递归来改进此代码。您还可以创建StringBuilder
唯一一次并在最后打印所有内容。
推荐阅读
- java - Spring Boot 中的邮件发送异常
- xamarin.forms - Xamarin Forms Prism (DialogService) with Switch in ListView items - EventToCommandBehaviour 触发多次
- reactjs - 如何打破 MUIDataTable 列单元格内容
- python - 如何在硒(python)中关闭标签广告
- java - Eclipse REST API 连接问题
- css - CSS:有没有办法不失去悬停,如果鼠标瞬间消失?
- node.js - 如何对 MongoDB 中的两个集合进行 $sum 值?
- ios - 无法在 SwiftUI 中使用本地 url 创建 PDFDocument(url: url)
- vpn - 如何使用 RestAssured 和代理通过 VPN 发出请求
- angular - 导航后不应重新运行 Angular 指令