如何计算循环所需的元素?

时间:2016-12-15 05:05:26

标签: math formula equation

我有以下数据: 的y正Y-Y-N-N-N 这无限重复,例如: 的y正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。

如何使用公式计算它?

1 个答案:

答案 0 :(得分:0)

我认为你所说的是你需要处理无限列表的前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 Xs的输入,你需要在无限列表中处理的元素数量是多少,以匹配那些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正Y-Y-N-N-N)

然后我们计算出中间结果:

  • iQuotient
  • 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.
  9. 通常,如果你的子列表ynyynnn没有预先定义,那么你就不能在步骤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