Java FizzBuzz递归解决方案
尝试使用Java中的FizzBuzz递归解决方案返回n次迭代的字符串列表。例如,n=4应该输出[“1”、“2”、“嘶嘶声”、4]。但是,使用我当前的代码,输出仅为[“4”]。为什么我的解决方案不执行递归函数?任何其他的批评都将不胜感激Java FizzBuzz递归解决方案,java,algorithm,list,recursion,fizzbuzz,Java,Algorithm,List,Recursion,Fizzbuzz,尝试使用Java中的FizzBuzz递归解决方案返回n次迭代的字符串列表。例如,n=4应该输出[“1”、“2”、“嘶嘶声”、4]。但是,使用我当前的代码,输出仅为[“4”]。为什么我的解决方案不执行递归函数?任何其他的批评都将不胜感激 class Solution { public List<String> fizzBuzz(int n) { //create variable to return list of strings List<String>
class Solution {
public List<String> fizzBuzz(int n) {
//create variable to return list of strings
List<String> fbList = new ArrayList<String>();
//base case 1
if(n == 0){
fbList.add(Integer.toString(0));
}
//base case 2
else if(n == 1){
fbList.add(Integer.toString(1));
}
//OW take n and begin reducing recursively from, n - 1
else{
if(n % 3 == 0){
fbList.add("Fizz");
}
else if(n % 5 == 0){
fbList.add("Buzz");
}
else if((n % 3 == 0) && (n % 5 == 0)){
fbList.add("FizzBuzz");
}
else{
fbList.add(Integer.toString(n));
}
//recursive function call
fizzBuzz(n - 1);
}
return fbList;
}
}
类解决方案{
公共列表fizzBuzz(国际n){
//创建变量以返回字符串列表
List fbList=new ArrayList();
//基本情况1
如果(n==0){
fbList.add(Integer.toString(0));
}
//基本情况2
else如果(n==1){
fbList.add(Integer.toString(1));
}
//现在取n,从n-1开始递归地减少
否则{
如果(n%3==0){
添加(“泡沫”);
}
否则如果(n%5==0){
添加(“嗡嗡声”);
}
else如果((n%3==0)和&(n%5==0)){
fbList.add(“FizzBuzz”);
}
否则{
fbList.add(Integer.toString(n));
}
//递归函数调用
嘶嘶声(n-1);
}
返回FBI列表;
}
}
问题在于,每次递归调用都会创建一个新的列表。您返回列表,但:
fizzBuzz(n - 1);
您将忽略递归调用的返回值。要解决此问题,您可以执行以下操作:
fbList.addAll(0, fizzBuzz(n - 1));
它将利用该方法添加递归调用返回的所有元素。这将返回:
[1, 2, Fizz, 4]
但是,这对于阵列列表来说相当昂贵。您可以将其更改为链接列表
,这将允许线性时间添加
另外,您的if/else if/else
链出现故障<代码>如果((n%3==0)和(&(n%5==0))
应该在如果(n%3==0)
和如果(n%5==0)
之前。否则,如果(n%5==0)
或如果(n%3==0)
,它将始终输入:
使用递归时要考虑简单,即让递归完成工作。如果您的递归正在倒计时,但希望列表以升序显示,请先添加所有其他内容,然后添加您正在处理的内容:
import java.util.*;
public class Solution {
public static List<String> pattern = Arrays.asList("FizzBuzz", "", "", "Fizz", "", "Buzz", "Fizz", "", "", "Fizz", "Buzz", "", "Fizz", "", "");
public static List<String> fizzBuzz(int n) {
List<String> fbList;
if (n > 0) {
fbList = fizzBuzz(n - 1);
String string = pattern.get(n % pattern.size());
fbList.add(string.isEmpty() ? Integer.toString(n) : string);
} else {
fbList = new ArrayList<String>();
}
return fbList;
}
public static void main(String[] args) {
System.out.println(fizzBuzz(Integer.parseInt(args[0])));
}
}
看起来您需要学习使用调试器。请随便吃点。如果您以后仍然有问题,请随时返回并提出更具体的问题。您可能希望运行else If((n%3==0)和&(n%5==0)){fbList.add(“FizzBuzz”);}
在If语句中的第一个语句中。该语句允许我输出值[“4”、“Fizz”、“2”、“1]。我猜这个解决方案只能按降序输出。有没有办法以升序输出?@alexjs000以逆序追加或反转整个结果。要将复杂性保持在O(n),使用函数反转整个顺序会不会使其为O(n^2)?@alexjs000您可以使用重载的addAll
方法将其添加到beginning@alexjs000不在每一步(总共n次)预加一个不是为该操作设计的数据结构(ArrayList)(即,它在已包含的元素数量上是线性的)将使其成为O(n^2)LinkedList
在prepend中是线性的。这是一个非常低效的O(n^2)
,因为您在每一步都要复制整个列表。不一定。有许多更有效的选项:可以使用具有有效前置的LinkedList,可以按相反顺序收集到ArrayList,然后按O(n)反转数组,或者可以将结果ArrayList作为参数传递。所有这些方法都是O(n)
@LieRyan,谢谢,我已经修改了解决方案,只使用一个ArrayList。
import java.util.*;
public class Solution {
public static List<String> pattern = Arrays.asList("FizzBuzz", "", "", "Fizz", "", "Buzz", "Fizz", "", "", "Fizz", "Buzz", "", "Fizz", "", "");
public static List<String> fizzBuzz(int n) {
List<String> fbList;
if (n > 0) {
fbList = fizzBuzz(n - 1);
String string = pattern.get(n % pattern.size());
fbList.add(string.isEmpty() ? Integer.toString(n) : string);
} else {
fbList = new ArrayList<String>();
}
return fbList;
}
public static void main(String[] args) {
System.out.println(fizzBuzz(Integer.parseInt(args[0])));
}
}
> java Solution 35
[1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, FizzBuzz, 16, 17, Fizz, 19, Buzz, Fizz, 22, 23, Fizz, Buzz, 26, Fizz, 28, 29, FizzBuzz, 31, 32, Fizz, 34, Buzz]
>