Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java FizzBuzz递归解决方案_Java_Algorithm_List_Recursion_Fizzbuzz - Fatal编程技术网

Java FizzBuzz递归解决方案

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>

尝试使用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> 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]
>