あなたが言っていることは、5Xを得るために無限リストの最初の10個の要素を処理する必要があると仮定します。
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イース以下のアルゴリズムがどのように説明しますサブリスト、総リストは無限に繰り返される)
- iLengthOfSubList = 7(あなたはサブリスト内の要素7 ynyynnnを持っている)
それから計算された中間結果を有する:
- iQuotient
- iPartialLengthOfList
- iPendingXs
- iPendingLengthOfList
- iResult
folloを翼の手順では、結果を与える必要があります:
- デバイドにiNumberOfXsにをiNumberOfYsInSubListで。ここで、これは私たちに5/3 = 1.666 ....
- を与えます。その結果の残りの部分(0.666 ...)を捨てて、のicootientとして1を残します。これは、反復処理が必要な完全なサブリストの数です。
- この商1にiLengthOfSubListを掛けて、1 * 7 = 7をiPartialLengthOfListとします。これは結果の部分和であり、あなたが反復する完全なサブリストの中の要素の数です。
- もiNumberOfYsInSubListと商を乗算し、iNumberOfXs、すなわちiNumberOfXsからこの製品を減算 - (iQuotient * iNumberOfYsInSubList)= 5 - (1 * 3)= 2.保存、この値2 としてiPendingXs、そのは、まだ一致していないXの数です。
- iPendingXsが常に未満iLengthOfSubList(すなわち、それはモジュロである、iPendingXs = iNumberOfXs MODULO iNumberOfYsInSubList)されることに注意してください。
- y-n-y-y-n-n-nのサブリストに2つのX(すなわち、上記の計算での値がiPendingXsの値)を一致させるという小さな問題があります。(iPendingLengthOfListとしてカウント)
- 一致する保留中のアイテムは、次のとおり iPendingXsに等しい
- iPendingXsはiPendingXs + 1に等しい0又は1
- あればそうでない場合(すなわち、場合iPendingXsが1より大きい)
- iPendingLengthOfList = 3、iPendingXsはあなたのサブ場合iPendingLengthOfList(3)は、一般に、即ち10
、答えは1
iPartialLengthOfList(7)の和とより大きいリストynyynnnが事前定義されていない場合、手順6でルールをハードコーディングすることはできませんが、上記の擬似コードと同様に、サブリストを1回ループして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
質問を適切に説明してください。 – Razin