首页 文章

Java FizzBuzz递归解决方案

提问于
浏览
1

在Java中尝试使用FizzBuzz递归解决方案返回带有n次迭代的字符串列表 . 例如,n = 4应输出[“1”,“2”,“Fizz”,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;
    }
}

2 回答

  • 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])));
        }
    }
    

    OUTPUT

    > 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]
    >
    
  • 0

    问题是每次递归调用都会创建一个新的 List . 您返回列表但是:

    fizzBuzz(n - 1);
    

    您忽略了递归调用的返回值 . 要解决此问题,您可以:

    fbList.addAll(0, fizzBuzz(n - 1));
    

    这将使用方法addAll添加递归调用返回的所有元素 . 返回:

    [1, 2, Fizz, 4]
    

    if/else if/else 链也出了故障 . if((n % 3 == 0) && (n % 5 == 0)) 应该在 if(n % 3 == 0)if(n % 5 == 0) 之前 . 否则它将始终输入 if(n % 5 == 0)if(n % 3 == 0)

    if((n % 3 == 0) && (n % 5 == 0)){
        fbList.add("FizzBuzz");
    }
    else if(n % 3 == 0){
        fbList.add("Fizz");
    }
    else if(n % 5 == 0){
        fbList.add("Buzz");
    }
    

相关问题