gpt4 book ai didi

javascript - 寻求有关大组合算法解释的帮助

转载 作者:行者123 更新时间:2023-11-28 03:14:20 25 4
gpt4 key购买 nike

最近的CodeSignal Challenge是要计算 1000C500 (mod 1e9+7),但我失败了。

我的所有尝试都超出了时间限制。这是best JS solution by psr 。谁能解释一下这一行发生了什么?我学了 ES6,但不知道它的语法 f[o = n + 1/k] = o in f ...

f = nCk = (n, k) => f[o = n + 1/k] = o in f
? ...
: ...
? n && ...
: ...

一些行被屏蔽以避免违反规则

最佳答案

感谢Barbar在问题评论中的解释,我现在明白了算法。

该算法可以重写如下:

f = nCk = (n, k) => {   //Declare both f and nCk as the same function
let o = n + 1/k //o will be the key of function object f
f[o] = o in f //Define f[o] based on a nested ternary expression
? f[o] //Avoid recalculation if f has key o already
: k==0 //nC0 is always 1
? 1
: n<k //nCk is improper and assigned 0 if n<k
? 0
: f(--n, k) //Do recursion nCk = (n-1)Ck + (n-1)C(k-1)
+ f(n, k - 1)
return f[o] //Done!
}

这是 5C2 的示例

f(n,k)  n   k   o   f[o]
f(5,2) 5 2 5.5 f[5.5]=f(4,2)+f(4,1)=10
f(4,2) 4 2 4.5 f[4.5]=f(3,2)+f(3,1)=6
f(3,2) 3 2 3.5 f[3.5]=f(2,2)+f(2,1)=3
f(2,2) 2 2 2.5 f[2.5]=f(1,2)+f(1,1)=1
f(1,2) 1 2 1.5 f[1.5]=f(0,2)+f(0,1)=0
f(0,2) 0 2 0.5 f[0.5]=0
f(0,1) 0 1 1 f[1]=0
f(1,1) 1 1 2 f[2]=f(0,1)+f(0,0)=1
f(0,0) 0 0 Inf f[Inf]=1 //Inf aka Infinity
f(2,1) 2 1 3 f[3]=f(1,1)+f(1,0)=2
f(1,0) 1 0 Inf f[Inf]=1
f(3,1) 3 1 4 f[4]=f(2,1)+f(2,0)=3
f(n,0) n 0 Inf f[Inf]=1
f(4,1) 4 1 5 f[5]=f(3,1)+f(3,0)=4

附注在研究这个算法时我得到了一些收获

  1. 在同一行上双重声明函数作为递归技巧

  2. 立即使用刚刚分配值的键

  3. 无穷大可以用作对象的键(!)

  4. 语法o in f检查对象f是否具有键o

关于javascript - 寻求有关大组合算法解释的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59775224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com