当前位置: 首页 > 知识库问答 >
问题:

将递归函数中的数据保存到列表中

呼延臻
2023-03-14

我正在研究一个函数,它使用递归调用将给定的输入分解为面值。

在每个步骤中,它都会递归为两个变量:

  1. 继续当前的硬币:将其添加到列表中并递归。
  2. 切换到下一个硬币:递增硬币pos和递归。

除了在剩余=0时打印列表中捕获的面额组合之外,我还打算捕获该列表的值并从函数返回它。

这是代码:

    static final int[] DENOMINATIONS = {9,5,3};

    private static void change(int remaining, List<Integer> coins, int pos)

        if (remaining == 0) {

       // This correctly prints the desired output. 
       // I want to return that exact value from the function.
            System.out.println(coins); 

        } else {
            if (remaining >= DENOMINATIONS[pos]) {
                coins.add(DENOMINATIONS[pos]);
                another.addAll(coins);
                change(remaining - DENOMINATIONS[pos], coins, pos);
                coins.remove(coins.size() - 1);
            }
            if (pos + 1 < DENOMINATIONS.length) {
                change(remaining, coins, pos + 1);
            }
        }
    }


    public static List<Integer> denominations(int amount) {
        List<Integer> result = new ArrayList<Integer>();
        List<Integer> another = new ArrayList<Integer>();
        change(amount, result, another ,0);
        System.out.println(another.size());
        return another;
    }

    public static void main(String[] args) {
        List<Integer> list = denominations(13);
        System.out.println(list);
    }

输出:[5,5,3]

共有3个答案

江坚成
2023-03-14

change应返回表示是否已找到答案的布尔值。

所以更改正文看起来像这样:

if (remaining == 0) {
  return true;
}
...
if (change(...)) return true;
...
return false;  // It's last line of body
唐博文
2023-03-14

您似乎假设java是通过引用传递的,这不是真的。Java方法是通过值传递的。

我已经更新了您的代码:

更改方法:

private static List<Integer> change(int remaining, List<Integer> coins, int pos) { // Updated method return type;

    if (pos < 0 || pos >= DENOMINATIONS.length) { // check if position is invalid
        return new ArrayList<>(); // return an empty list
    }

    if (remaining == DENOMINATIONS[pos]) { // check if remaining is equal to denominations[pos]
        coins.add(DENOMINATIONS[pos]); // add the denominations to the coins result
        return coins; // return the result
    } else if (remaining > DENOMINATIONS[pos]) { // check if remaining is greater than denominations[pos]
        coins.add(DENOMINATIONS[pos]);// add the possible denominations to the coins result
        remaining = remaining - DENOMINATIONS[pos]; // calculate the new remaining
        if (remaining >= DENOMINATIONS[pos]) { // check if remaining is greater than or equal to denominations[pos]
            return change(remaining, coins, pos); // stick to this position
        } else {
            return change(remaining, coins, pos + 1); // increment pos to go to the lower denominations
        }
    } else if (remaining < DENOMINATIONS[pos]) { // check if remaining is lesser than denominations[pos]
        if (coins.isEmpty()) { // if coins is empty then go to the next denomination
            return change(remaining, coins, pos + 1);
        } else {
            coins.remove(coins.size() - 1); // remove the previous denomination
            return change(remaining + DENOMINATIONS[pos - 1], coins, pos); // go back to the previous remaining and // try this DENOMINATIONS[pos]
        }
    }
    return coins;
}

面额法:

public static List<Integer> denominations(int amount) {
    return change(amount, new ArrayList<Integer>(), 0);
}

INPUT:13
OUTPUT:[5,5,3]

宋俊艾
2023-03-14

您将不得不添加返回硬币;Change方法的和,但您可以保持它的方式。返回和更改数组是一种代码味道,因为方法既对对象进行操作(修改它),又返回结果。

要使其正常工作,您可以按如下方式定义您的面额方法

public static List<Integer> denominations(int amount) {
   List<Integer> result = new ArrayList<Integer>();
   change(amount, result, 0);
   return result;
}

编辑:

列表是空的,因为它唯一更改的地方是这里:

coins.add(DENOMINATIONS[pos]);
change(remaining - DENOMINATIONS[pos], coins, pos);
coins.remove(coins.size() - 1);

添加和删除元素的位置。是你写的东西让它空空如也:)

编辑2:

我建议传递第二个对象,它是您想要返回的列表的副本,并且不会被修改。

 类似资料:
  • 问题内容: 我正在尝试制作一个可为特定类别递归构建路径的函数 当我尝试使用没有父项的类别(parent_id = 0)运行此函数时,它可以正常工作,但是当我尝试使用parent_id> 0的类别时,我得到1424递归存储的函数和触发器是不允许的。 我该如何解决?我将在常规的Web托管服务上托管此代码,该服务至少应具有MySQL服务器版本5.1。 在Ike Walker的帮助下,我做了一个程序,但是

  • 有递归函数的问题,应该相对简单做,但似乎不能得到正确的。 我有一个文件夹结构,它的文件夹可以包含其他文件夹、图像或文件。每个文件夹都有权限。我想让我的函数递归地构建一个与每个文件夹关联的权限列表。 改了号, 得到:

  • 我面临着使用Spring数据JPA存储库将数据保存到数据库的问题。 我的场景是:我使用循环逐个收集和保存数据。收集所有数据需要很多时间。因此,我想将每个记录的数据立即保存到表中并保存到数据库中。我正在使用saveAndFlush方法,但数据并没有立即保存到表中。 我迫不及待地要收集所有数据,因为收集所有数据可能需要一整天。

  • 几个月前我学习了递归,现在这一切都很混乱。有一个人可以解释我整个功能是如何正常工作的,但我有点明白它是如何工作的,但我认为有些步骤在我的脑海中并不是很清楚。病人的Thx提前。

  • 考虑Python中的这个基本递归: 根据斐波那契数列的(n-1)(n-2)函数,这是有道理的。 Python如何执行包含另一个递归的递归,这个递归不在同一代码行内,而是在同一代码行内?“finobacci(number-1)”是否完成所有递归,直到它到达“1”,然后它对“fibonacci(number-2)”做同样的事情,并将它们相加? 作为比较,下面的递归函数将一个数“x”提升为“y”的幂,我

  • 问题内容: 是否可以通过java的辅助函数保留信息,而无需使用静态变量。 例如, 也就是说,我想更新变量v而不丢失每个递归情况的信息,而不必访问函数外部的变量。 问题答案: 忘记所有告诉您声明属性或在每次递归调用中更新可变对象的答案。在真正的功能性递归样式中,您可以通过将信息作为参数和/或返回类型传递来“保留”信息。 让我用一个简单的示例进行说明,假设您要递归地计算中的元素之和。在这里, 状态 (