【问题标题】:How to calculate elements needed from a loop?如何计算循环所需的元素?
【发布时间】:2016-12-15 05:05:25
【问题描述】:

我有以下数据: y-n-y-y-n-n-n 这无限重复,例如: y-n-y-y-n-n-n-y-n-y-y-n-n-n-y-n-y-y-n-n-n...

我有 5 个“x”。 “x”只与“y”连在一起。 意思是,如果我在上面的循环中分配 x ,它将是: y-n-y-y-n-n-n-y-n-y-y-n-n-n x---x-x-----x-x

我想计算需要使用多少个循环元素才能将 5 x 展开,答案是 10。

如何用公式计算?

【问题讨论】:

  • 能否正确解释您的问题?

标签: math formula equation


【解决方案1】:

我认为您的意思是您需要处理无限列表的前 10 个元素以获得 5 个 Y,这与您拥有的 5 个 X 匹配/坚持。

y-n-y-y-n-n-n-y-n-y-y-n-n-n-y-n-y-y-n-n-n... 
x-_-x-x-_-_-_-x-_-x 
                  ^
                  L____ 10 elements read from the infinite list to place the 5 x's. 

我还假设您的问题是:给定 5 个 X 的输入,您需要在无限列表中处理多少个元素才能匹配这 5 个 X。

您可以使用类似以下伪代码的循环来计算它:

iElementsMatchedCounter = 0 
iXsMatchedCounter = 0 
iXLimit = 5 
strElement = "" 

if (InfiniteList.IsEmpty() == false) 
{ 
    do 
    { 
        strElement = InfiniteList.ReadNextElement()

        if (strElement == "y") 
        { 
            iXsMatchedCounter += 1 
        } 

        iElementsMatchedCounter += 1 

    } while ( (InfiniteList.IsEndReached() == false) AND (iXsMatchedCounter < iXLimit) ) 
} 

if (iXsMatchedCounter = iXLimit) 
    then Print(iElementsMatchedCounter) 
    else Print("End of list reached before all X's were matched!") 

上述方法的缺点是您实际上是在读取无限列表,这可能不是可取的。

相反,如果您知道您的列表是相同元素 y-n-y-y-n-n-n 的无限重复序列,您甚至不需要遍历整个列表,只需对子列表 y-n-y-y-n-n-n 进行操作。以下算法描述了如何:

鉴于您的初始输入:

  • iNumberOfXs = 5(你有 5 个 X 可以匹配)
  • iNumberOfYsInSubList = 3 (子列表中有3个Y,总列表无限重复)
  • iLengthOfSubList = 7(子列表中有 7 个元素 y-n-y-y-n-n-n)

然后我们得到计算的中间结果:

  • 智商
  • iPartialLengthOfList
  • iPendingXs
  • iPendingLengthOfList
  • iResult

以下步骤应该会给出结果:

  1. iNumberOfXs 除以 iNumberOfYsInSubList。在这里,这给了我们 5/3 = 1.666....
  2. 丢弃结果的其余部分(0.666...),因此您将剩下 1 作为 iQuotient。这是您必须迭代的完整子列表的数量。
  3. 将此商 1 与 iLengthOfSubList 相乘,得到 1*7=7 作为 iPartialLengthOfList。这是结果的部分总和,是您迭代的完整子列表中的元素数。
  4. 还将商与 iNumberOfYsInSubList 相乘,然后从 iNumberOfXs 中减去该乘积,即 iNumberOfXs - (iQuotient * iNumberOfYsInSubList) = 5 - (1 * 3) = 2。将此值 2 保存为 iPendingXs,这是尚未匹配的 X 的数量。
  5. 请注意,iPendingXs 将始终小于 iLengthOfSubList(即它是一个模数,iPendingXs = iNumberOfXs MODULO iNumberOfYsInSubList)。
  6. 现在您遇到了在 y-n-y-y-n-n-n 的子列表中匹配 2 个 X(即上面计算的 iPendingXs 的值)的小问题。
  7. 待匹配项(计为iPendingLengthOfList)是:
    • 如果 iPendingXs 为 0 或 1,则等于 iPendingXs
    • 否则等于 iPendingXs + 1(即如果 iPendingXs 大于 1)
    • 在这种情况下,iPendingLengthOfList = 3,因为 iPendingXs 大于 1。
  8. iPartialLengthOfList(7)和iPendingLengthOfList(3)之和就是答案,即10。

一般来说,如果您的子列表 y-n-y-y-n-n-n 不是预定义的,那么您不能在步骤 6 中对规则进行硬编码,而是必须仅遍历子列表一次以计算 Y 和元素,类似于上面给出的伪代码。

当涉及到实际代码时,您可以使用整数除法和模运算来快速分别进行第 2 步和第 4 步中的操作。

iQuotient = iNumberOfXs / iNumberOfYsInSubList     // COMMENT: here integer division automatically drops the remainder 
iPartialLengthOfList = iQuotient * iLengthOfSubList 

iPendingXs = iNumberOfXs  - (iQuotient  * iNumberOfYsInSubList) 
// COMMENT: can use modulo arithmetic like the following to calculate iPendingXs 
// iPendingXs = iNumberOfXs % iNumberOfYsInSubList 

// The following IF statement assumes the sub-list to be y-n-y-y-n-n-n 
if (iPendingXs > 1) 
    then iPendingLengthOfList = iPendingXs + 1 
    else iPendingLengthOfList = iPendingXs 

iResult = iPartialLengthOfList + iPendingLengthOfList 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 2020-12-11
    • 2014-05-17
    • 2020-01-19
    • 2018-10-30
    • 1970-01-01
    • 2021-06-25
    相关资源
    最近更新 更多