Java FizzBuzz рекурсивное решение - PullRequest
0 голосов
/ 10 декабря 2018

Попытка рекурсивного решения FizzBuzz в Java вернуть список строк с 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 голосов
/ 10 декабря 2018

Думайте просто при работе с рекурсией, т.е. пусть рекурсия сделает всю работу.Если ваша рекурсия ведет обратный отсчет, но вы хотите, чтобы список выходил по возрастанию, сначала добавьте все остальное , а затем добавьте то, над чем вы работаете:

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 голосов
/ 10 декабря 2018

Проблема в том, что при каждом рекурсивном вызове создается новый List.Вы возвращаете список, но:

fizzBuzz(n - 1);

Вы игнорируете возвращаемое значение рекурсивных вызовов.Чтобы это исправить, вы можете сделать:

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

, который будет использовать метод addAll, чтобы добавить все элементы, возвращаемые рекурсивными вызовами.Это возвращает:

[1, 2, Fizz, 4]

Однако это довольно дорого для ArrayList.Вы можете изменить это на LinkedList, что позволило бы добавлять линейное время.


Также у вас 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");
}
...