【问题标题】:calculate number of cards in a house of cards计算纸牌屋中的纸牌数量
【发布时间】:2018-06-07 18:43:21
【问题描述】:

背景故事:

所以我儿子随机来找我,问我如何写一个代数 (?) 表达式来计算根据指定的级别数制作一个纸牌屋需要多少张纸牌。我相当肯定这实际上不是一个家庭作业问题。如果他需要帮助,他通常会向我展示工作表。

“假设”是

a) 每层之间有水平放置的卡片,用于支撑;一张卡作为两个“高峰”之间的“桥梁” b) 最低(地面)层下面没有任何水平卡片,因为地板/桌子本身就是支撑。

例如,单层只有 2 张卡片:/\

再举个例子:3层一共15张卡片(请见谅我的烂图!)

   /_\
 /_\ /_\
/ \/ \/ \

嗯,我不擅长这种事情。我只知道基本代数,但我想认为自己是一个相当体面的(但不是“专业”)程序员。但无论如何,对于一个纯粹的代数公式,我无法想出一个公式来计算 所有 卡片,但我确实设法想出了一个计算给定层的卡片数量的公式,基于以上假设: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;
}

与函数的返回值相比,我做了一些手动计数卡,这似乎是合法的,所以我应该很高兴,但是..我觉得这可以做得更好。所以..

问题:

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

【问题讨论】:

    标签: javascript algebra


    【解决方案1】:

    这个表达式涵盖了它:

    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);
    }

    我是怎么到那里的?我计算了前几个值,然后在WolframAlpha 上运行多项式插值。

    【讨论】:

    • 啊哈!这绝对比我想出的要好得多,谢谢!现在要弄清楚该公式实际上发生了什么,但我可以打开一本书。再次感谢!
    【解决方案2】:

    所有这些 cmets 都是很好的反馈,但它们中的大多数在 2 或 1 处都有缺陷。这个等式有效,但您需要了解 sigma,所以查一下,这有效。

                   x-1.         x-1
               Y=(2sigma x+1)+(sigma x+1)-x
                   n=0.         n=0
    

    这意味着你添加了x to x-1 and addition of this to x-2等。

    直到你达到零并将其乘以二。这将找到交叉卡的卡数。另一部分查找平面卡的卡。它通过添加x+x-1+x-1 等来做到这一点。

    直到像顶部一样达到零,然后减去x,因为随着层数的增加,您将不得不从每个平面层中取出一张卡片,并且由于x是层数,因此每次都有效.

    【讨论】:

      【解决方案3】:
      I am not sure about the algebraic formula but got a pattern
      
      start = 2 (basic 1 level) then as and how you need to increase a level the extra cards will be 5 (level 2) so total is 5+2=7, then for level 3 you need 8(level 3) cards extra from level 2 that would be 7+8=15. So summing up we can write this, basically it forms a simple progression. we need to find the sum of progression. Here is a formula for number of cards for a given height or level,
      
          2 + ((10+(n-1)3)*(n/2))
      
          where n is the level or height.
      
      example : level 1, n=1 => 7
      
        /_\  -> level 1
       /\ /\ -> level 0
      
      example : level 2, n=2 => 15
      
        /_\     -> level 2
       /_\/_\   -> level 1
      / \/ \/ \ -> level 0
      

      【讨论】:

      • 它不适用于 n=0,但我已经尝试了 4-5 个案例,可能会错过关键测试案例。感谢您指出这一点。
      • 计算结果为 26,n=3,=> 2+((10+(3-1)*3))*(3/2) => 2+((10+2* 3))*(3/2) => 2+((10+6))*(3/2) => 2+(16)*(3/2) => 2+8*3 => 2+ 24 => 26
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 2015-03-01
      • 2018-09-11
      • 2023-01-11
      相关资源
      最近更新 更多