sli*_*khi 3 javascript algebra
背景故事:
所以我的儿子随机向我走来,询问如何编写一个代数(?)表达式来计算根据指定的级别数量制作一套纸牌所需的卡数.我很确定这实际上不是一个家庭作业问题; 如果他需要帮助,他通常会向我展示工作表.
"假设"就是这样
a)每层之间都有水平放置的卡片,用于支撑; 一张卡片作为两个"峰值"之间的"桥梁"b)最低(地平面)层下面没有任何水平卡片,因为地板/桌子本身就是支撑物.
例如,单个图层只有2张卡片: /\
另一个例子:3层共有15张卡(请原谅我糟糕的图片!)
/_\
/_\ /_\
/ \/ \/ \
Run Code Online (Sandbox Code Playgroud)
嗯,我在这种事情上很糟糕.我只知道基本代数,但我想认为自己是一个相当不错的(但不是"专业")程序员.但无论如何,对于一个纯粹的代数公式,我无法提出计算所有卡的公式,但我确实想出了一个公式来计算给定图层的卡数,基于以上假设:2v + (v - 1)
好吧,可能有一个更好/简化的方程式,而且,这仅适用于给定的层,而不是所有层.因此,例如第1层(顶层),v = 1,因此卡的数量为2.或者对于第3层,v = 3,因此卡的数量达到8(因此该公式计算水平支撑作为给定图层的一部分).
而且......就像我用纯代数一样.然而!使用一些计算机代码(javascript是我使用的),我能够根据上面的等式创建一个函数,以返回卡的数量:
function getNumHouseCards(layers) {
var layers = layers || 1;
var cards = 0;
for (var v = 1; v <= layers; v++) {
cards += (2 * v) + (v - 1);
}
return cards;
}
Run Code Online (Sandbox Code Playgroud)
与功能的返回值相比,我做了一些手动计数卡,这看起来是合法的,所以我应该感到高兴,但是......我觉得这可以做得更好.所以..
题:
如何改进?我想首先,有没有办法用代数表达式来编写这个,或者编码真的需要回答这样的事情?在任何一种情况下,我都觉得我已经过度复杂了(好吧,至少我做过的部分......)
这个表达涵盖了它:
(y表示卡的数量,x表示层数)
在JavaScript中实现,并将输出与方法的输出进行比较:
function yourNumberOfCards(layers) {
var layers = layers || 1;
var cards = 0;
for (var v = 1; v <= layers; v++) {
cards += (2 * v) + (v - 1);
}
return cards;
}
function myNumberOfCards(layers) {
return (3 * Math.pow(layers, 2)) / 2 + (layers / 2);
}
for (let i = 1; i <= 10; i++) {
const yours = yourNumberOfCards(i);
const mine = myNumberOfCards(i);
console.log(yours + (yours === mine ? " == " : " != ") + mine);
}Run Code Online (Sandbox Code Playgroud)
我怎么到那儿?我计算了前几个值,然后在WolframAlpha上运行了多项式插值.