Functional programming 如何将这个大阶乘函数转换为高阶函数?

Functional programming 如何将这个大阶乘函数转换为高阶函数?,functional-programming,factorial,higher-order-functions,Functional Programming,Factorial,Higher Order Functions,以下代码使用阶乘函数外部的缓存对象。factorial函数本身很大,它太多地关注查找factorial和缓存 如何将此代码转换为高阶函数,并在调用时生成相同的结果 console.log(factorial(5)); console.log(factorial(7)); cache={} 函数阶乘(n){ 如果(n==0){ 返回1; } if(缓存[n]) { 返回缓存[n]; } 控制台日志(“堆栈:+n); var值=n*阶乘(n-1); console.log(“向下叠加:+值);

以下代码使用
阶乘
函数外部的
缓存
对象。
factorial
函数本身很大,它太多地关注查找factorial和缓存

如何将此代码转换为高阶函数,并在调用时生成相同的结果

console.log(factorial(5));
console.log(factorial(7));
cache={}
函数阶乘(n){
如果(n==0){
返回1;
}
if(缓存[n])
{
返回缓存[n];
}
控制台日志(“堆栈:+n);
var值=n*阶乘(n-1);
console.log(“向下叠加:+值);
缓存[n]=值;
返回值;
}
console.log(阶乘(5));
console.log(阶乘(7))已经有了,但我将把这个答案改编成javascript中的阶乘,这样您就可以更容易地看到它是如何工作的

编写记忆递归函数的秘密是延续传递风格。当您希望使非尾部递归函数堆栈安全时,也可以使用类似的技术

在第一个示例中,我将留下一些
console.log
语句,这样您就可以看到它何时实际在计算,何时只是在执行备忘录查找

const memoise=f=>{
const memo=新地图()
常数计算=(x,k)=>
(console.log('compute',x),
memo.get(x,memo.set(x,f(x,k)))
const lookup=x=>
(console.log('lookup',x),
memo.has(x)?memo.get(x):计算(x,查找))
返回查找
}
常数k=(x,k)=>{
如果(x==0)
返回1
其他的
返回x*k(x-1)
}
const memfact=备忘录(factk)
console.log(memfact(5))//120

console.log(memfact(7))//5040
这样一个高阶函数通常被称为memoize/memoization对google来说是一个很好的关键字。看看我们可以进一步使用部分应用程序-
fibk=k=>x=>…
我不认为部分应用程序这次会有什么帮助。。。请给我看看^_^也许这没什么帮助,但是
const lookup=x=>(memo.has(x)?memo:memo.set(x,comp(x)).get(x);常数comp=f(查找)