计算一套纸牌的卡数

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)

与功能的返回值相比,我做了一些手动计数卡,这看起来是合法的,所以我应该感到高兴,但是......我觉得这可以做得更好.所以..

题:

如何改进?我想首先,没有办法用代数表达式来编写这个,或者编码真的需要回答这样的事情?在任何一种情况下,我都觉得我已经过度复杂了(好吧,至少我做过的部分......)

Rob*_*sen 6

这个表达涵盖了它:

表达

(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上运行了多项式插值.