Java FizzBuzz递归解决方案
Java FizzBuzz recursive solution
尝试 Java 中的 FizzBuzz 递归解决方案到 return 具有 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;
}
}
问题是每次递归调用都会创建一个新的 List
。您 return 列表但是:
fizzBuzz(n - 1);
您忽略了递归调用的 return 值。要解决此问题,您可以这样做:
fbList.addAll(0, fizzBuzz(n - 1));
这将利用方法 addAll
添加所有由递归调用 return 编辑的元素。这 returns:
[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");
}
使用递归时要考虑简单,即让递归完成工作。如果您的递归正在倒计时,但您希望列表按升序排列,请先添加 其他所有内容,然后添加您正在处理的内容:
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]
>
尝试 Java 中的 FizzBuzz 递归解决方案到 return 具有 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;
}
}
问题是每次递归调用都会创建一个新的 List
。您 return 列表但是:
fizzBuzz(n - 1);
您忽略了递归调用的 return 值。要解决此问题,您可以这样做:
fbList.addAll(0, fizzBuzz(n - 1));
这将利用方法 addAll
添加所有由递归调用 return 编辑的元素。这 returns:
[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");
}
使用递归时要考虑简单,即让递归完成工作。如果您的递归正在倒计时,但您希望列表按升序排列,请先添加 其他所有内容,然后添加您正在处理的内容:
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]
>