【发布时间】:2023-03-28 19:17:01
【问题描述】:
我有一个基本的coinSums递归函数:
function coinSums(total) {
var coins = [1, 5, 10, 25];
var output = [];
var memo={} <--the only part im sure about :)
function subroutine(pos, runningSum, currentCombo) {
if (total === runningSum) {
return output.push(currentCombo)
} else if (total < runningSum) {
return false
} else
for (var i = pos; i < coins.length; i++) {
subroutine(i, runningSum + coins[i], currentCombo.concat(coins[i]))
}
}
subroutine(0, 0, [])
return output.length; }
我真的很想找到一种“记忆”它的方法来改进 O(n^k) 运行时(k=num of coins、n=target,对吗?),但请保留它
递归而不是尽可能少地改变递归调用。 (我需要保持组合和runningSum 自下而上
方法)。
我知道如何使用自上而下的方法。任何天才 有什么想法吗?
ps 我们可以在for 循环中将pos 更改为i
从 0 开始,为我们提供有序组合的数量。我需要
返回无序的组合,这就是我要维护的原因
连击。
【问题讨论】:
-
请注意,记忆化是动态编程中的一项基本技术,如果之前使用相同的参数调用它,它可以防止递归。您提到更喜欢保留递归,但它不会是动态编程。
-
我不知道整个问题,但我认为你应该使用
Bit Masking方法来解决这个问题。 -
1.如果你正在寻找记忆,这里是链接addyosmani.com/blog/faster-javascript-memoization 2。在 JS 中,函数也是一个对象,所以你不必声明一个新对象来缓存值。相反,您可以使用 functionName[input] 来存储当前输入的输出。 3. var memo = {} 是一个对象,用于存储/缓存特定输入的结果。
标签: javascript recursion dynamic-programming memoization