Java中的递归和While循环



我正在写一个递归程序:

public static List<Integer> method(int n)

以确定正数CCD_ 2是否是正(>0(的立方体的总和。示例:给定n = 1944(12^3+6^3(,程序将按降序返回列表[12, 6]。如果n不是多维数据集的总数,则程序应返回一个空列表。

程序应该为第一个元素返回以可能的最高值开头的值,然后对其余元素遵循相同的规则。例如,当n = 1072时,程序将返回[10, 4, 2]而不是[9, 7]

应该发生递归的方法:

private static boolean method(int n, int c, LinkedList<Integer> seen)

其中CCD_ 10是仍然允许使用的最高数字,而CCD_。

我的代码涵盖了基本情况和递归,但循环的继续存在问题。输入n = 1944后,我的程序将返回列表[12],而不是[12, 6]

public static List<Integer> method(int n)
{
LinkedList<Integer> result = new LinkedList<Integer>();
int c = (int) Math.cbrt(n);
result.add(c);
method(n, c, result);
return result;
}
private static boolean method(int n, int c, LinkedList<Integer> seen)
{
LinkedList<Integer> result = new LinkedList<Integer>();
boolean b = false;
if (n == 0)
{
return true;  
}
else if (c == 0)
{
return false;
}
else 
{
int sum = 0;
for (int i : seen)
{
sum += i*i*i;
}
while (b = false)
{
c = (int) Math.cbrt(n - sum);
seen.add(c);
method(n, c, seen);
if (sum == n)
{
result = seen;
return true;
}
else
{
return false;
}
}
}
return false;
}

让我们看看你的while循环:

LinkedList<Integer> result = new LinkedList<Integer>();
boolean b = false;
// Some code omitted here.
while (b = false)
{
c = (int) Math.cbrt(n - sum);
seen.add(c);
method(n, c, seen);
if (sum == n)
{
result = seen;
return true;
}
else
{
return false;
}
}

首先,对于总是以false作为循环条件的while循环,它什么都不做。

不管怎样,即使我们假设循环正在运行,无论if采用的分支是什么,都将达到return。因此,即使while循环的条件更改为始终为n0,它也不会循环。此外,为b变量指定的唯一值是false,它根本不用于任何事情。

此外,第二种方法中的result列表总是空的。而且,由于result = seen;指令正好在return之前,所以它是一个无害的指令,会使result变得毫无用处。

另外,请查看method(n, c, seen);调用。它不会对返回值做任何操作!因此,即使它最终返回true,您仍然可以继续,这将生成false

此外,无论何时向seen添加值,都不会将其删除。由于seen在每个递归方法调用中都是相同的列表,因此一旦在其中添加了一个坏数字,就永远不会删除它来为其他东西让路。

有了这些,我必须得出结论,你的算法太坏了,必须从头开始重写。

此外,虽然你的问题不是很清楚,但我认为找到的数字肯定都不一样。否则,可以使2 = 13+ 13,并且每个大于1的数字都可以用许多立方一的和来表示(即n = 13+ 13+ 13+ ...(。

算法是这样的:

  • 第一步是让foricbrt(n)计数到1,试图形成立方体
  • 然后,从n中减去立方体,并递归地尝试为得到的数字找到立方体和
  • 添加一个参数以避免重复数字,该参数比上次使用的数字小一个
  • 形成多维数据集时,返回形成它的数字。在外部调用中,将结果添加到非空内部递归调用的列表中
  • 如果内部递归调用的结果是给出了一个空列表,那么for的当前迭代产生了一个坏数字,我们应该尝试下一个(如果我们有下一个(
  • 如果for结束时没有形成多维数据集,则返回一个空列表

这是代码:

import java.util.LinkedList;
import java.util.List;
public class Main {
public static List<Integer> findCubeSum(int n) {
return findCubeSum(n, n);
}
public static List<Integer> findCubeSum(int n, int max) {
if (n <= 0) return List.of();
int c = (int) Math.cbrt(n);
for (int i = Math.min(c, max); i > 0; i--) {
int x = i * i * i;
if (x == n) {
List<Integer> result = new LinkedList<>();
result.add(i);
return result;
}
List<Integer> result = findCubeSum(n - x, i - 1);
if (result.isEmpty()) continue;
result.add(0, i);
return result;
}
return List.of();
}
public static void main(String[] args) {
System.out.println(findCubeSum(8));    // [2]
System.out.println(findCubeSum(64));   // [4]
System.out.println(findCubeSum(1000)); // [10]
System.out.println(findCubeSum(1072)); // [10, 4, 2]
System.out.println(findCubeSum(1944)); // [12, 6]
System.out.println(findCubeSum(4));    // []
System.out.println(findCubeSum(0));    // []
System.out.println(findCubeSum(-1));   // []
System.out.println(findCubeSum(10));   // []
}
}

请在视频上观看它的运行。

发布的代码有很多问题。然而,您的问题是关于public static List<Integer> method(int n):

public static List<Integer> method(int n)  {
LinkedList<Integer> seen = new LinkedList<>();
method(n, 0, seen);
return seen;
}

考虑更改

private static boolean method(int n, int c, LinkedList<Integer> seen)

private static boolean method(int n, LinkedList<Integer> seen)

因为您通过c = (int) Math.cbrt(n);重新计算c的值

相关内容

  • 没有找到相关文章