【发布时间】:2021-12-14 01:29:51
【问题描述】:
假设我有一个这样的递归回调(但更复杂):
const weightedFactorial = useCallback(n => {
if (n === 0) {
return 1;
}
return weight * n * weightedFactorial(n - 1);
},[weight]);
有没有办法存储以前计算的值,这样如果在重复索引上调用函数,就可以跳过递归?
const value1 = weightedFactorial(60)
// Calculate recursively
const value2 = weightedFactorial(30)
// This value should already be known
// and the calculation should be skipped
我试图保持一个具有已知值的状态,但我似乎陷入了一个循环,可能是因为它需要成为回调的依赖项,
const [knownValues, setKnownValues] = useState([{ n: 0, value: 1 }]);
const weightedFactorial = useCallback(n => {
const known = knownValues.find(known => known.n === n);
if (known?.value) {
return known.value;
}
const newValue = weight * n * weightedFactorial(n - 1);
setKnownValues(knownValues => [...knownValues, { n, value: newValue }]);
return newValue;
},[knownValues, weight]);
【问题讨论】:
-
不要使用状态。使用参考。并使其成为一个简单的数组或
Map,您可以在其中按索引查找。 -
对于
useCallback()来说似乎不是一个好的用例(因为首先不能保证所有以前记住的值仍然可以访问)。这似乎是一项动态编程任务,但如果没有看到您的实际回调,就无法提出一些有意义的解决方案。 -
@Bergi - 谢谢,这正是我需要的提示。当某些依赖项发生更改时,我还必须添加一个 useEffect 来重置地图,但它运行良好。请随时提交答案,以便我接受。
-
@YevgenGorbunkov - 这似乎是我的示例代码不起作用的原因,但可以使用 ref
标签: javascript reactjs recursion react-hooks