2 Stimmen

Suche nach einer Positions-Funktion in rekursiver Formel

Zunächst einmal beachten Sie, dass mein Englisch hier nicht das beste ist. Wenn jemand daran interessiert ist, mir bei der Lösung dieses Problems zu helfen und etwas besser zu erklären, zögern Sie nicht, weitere Details anzufordern.

Eine spezifische Lösung in einer beliebigen gegebenen Sprache mit Tags wird sehr geschätzt. Auch wenn eine allgemeinere Lösung in Form einer Formel das Ziel dieser Frage ist.

Danke


Sequenzregel SR definieren, eine feste Sequenz ganzer Zahlen:

SR = (a, b, c, d, ..)


Beispiel

SR = (1, 2, 3, 5)

Verschiebungssequenzregel SS definieren, die aus SR abgeleitete Sequenz lautet:

SS = (a-0, b-a, c-b, d-c,..-d)


Beispiel

(1-0, 2-1, 3-2, 5-3) = (1, 1, 1, 2)

Die Verschiebungssequenzregel SS sollte gemäß der folgenden rekursiven Formel eine Ausgangssequenz OS berechnen:

OS(n) = 0, n=0

OS(n) = OS(n-1) + SS(i), n>0

wobei i die Position von n in der aktuellen Untergruppe SS ist.


Beispiel

OS(n) = (1, 2, 3, 5, 6, 7, 8, 10, 11, 12, 13, 15..)

wobei n=(1,2,3,4,5,6,7,8,9,10,11,12,..).

OS(0) = 0
OS(1)  = OS(0)  + SS(1) = 0 + 1  = 1
OS(2)  = OS(1)  + SS(2) = 1 + 1  = 2
OS(3)  = OS(2)  + SS(3) = 2 + 1  = 3
OS(4)  = OS(3)  + SS(4) = 3 + 2  = 5
OS(5)  = OS(4)  + SS(1) = 5 + 1  = 6
OS(6)  = OS(5)  + SS(2) = 6 + 1  = 7
OS(7)  = OS(6)  + SS(3) = 7 + 1  = 8
OS(8)  = OS(7)  + SS(4) = 8 + 2  = 10
OS(9)  = OS(8)  + SS(1) = 10 + 1 = 11
OS(10) = OS(9)  + SS(2) = 11 + 1 = 12
OS(11) = OS(10) + SS(3) = 12 + 1 = 13
OS(12) = OS(11) + SS(4) = 13 + 2 = 15

Was mir tatsächlich fehlt (nicht bekomme), ist die aktuelle Position von n in der zugehörigen Verschiebungsgruppe, gegeben n allein, sodass:

pos(n)=i -> S(pos(n)) = S(i)

daher kann ich abschließend schreiben

OS(0) = 0

OS(n) = OS(n-1) + SS(pos(n))


Was ich bisher herausgefunden habe, ist eine Formel für den aktuellen Index der Verschiebungsgruppe. Ich vermute, dass es mir helfen kann, die gewünschte Positionsformel pos(n) zu bestimmen, weiß aber nicht wie :((

Der Gruppenindex kann als folgt ausgedrückt werden:

G(n)=ceiling(n/D(SS))

Wobei D(SS) die Dimension von SS ist, also die Anzahl der Elemente in der Sequenzregel.


Beispiel

Zum Beispiel erstreckt sich die Sequenz $n$ von 1 bis 12. Die Anzahl der Verschiebungsgruppen (1,1,1,2) mit Dimension 4, die eine 1->1 Zuordnung zu OS(n) herstellen, beträgt 3 = 12/4.

Der Gruppierungsindex für n=9 kann berechnet werden als:

 G(9) = ceiling(n/D(SR)) = ceiling(9/4) = 3

ENDGÜLTIGE ANTWORT


Die Verwendung des %-Operators ist das, was mir gefehlt hat. Die endgültige rekursive Formel lautet:

OS(n) = 0, n=0

OS(n) = OS(n-1) + SS((n + D(SR)-1) % D(SR) + 1), n>0

Oder unter Verwendung einer rein mathematischen Formel (und der obigen Definition des Gruppenindex):

OS(n) = 0, n=0

OS(n) = OS(n-1) + SS((n + D(SR)-1 - (D(SR) * G(n)) + 1), n>0


DANKE @GARETH

4voto

Gareth Rees Punkte 62623

Die Frage ist ziemlich schwer zu verstehen, aber ich glaube, dass du nach der Modulo-Operation suchst.

Die Sequenz SS hat 4 Elemente, also ist pos(n) n modulo 4.

Diese Operation kann in vielen Programmiersprachen—einschließlich C# und Ruby—mit dem %-Operator und in Haskell mit der mod-Funktion berechnet werden.


Wenn du möchtest, dass das Modulo im Bereich von 1 bis 4 liegt anstatt von 0 bis 3, verwende diesen Ausdruck:

(n + 3) % 4 + 1

0 Stimmen

Ja, der Rest ist (fast) die gewünschte Funktion. Das einzige Problem tritt auf, wenn der Rest 0 ist, dann sollte die neueste Position zurückgegeben werden. Zum Beispiel 9%4=1 stimmt. Aber 12%4=0, während ich in meiner Situation gerne 4 hätte. Glaubst du, dass es möglich ist, bedingte Überprüfungen zu umgehen und einfach eine mathematische Formel zu haben?

0 Stimmen

Vielen Dank für Ihre ausgezeichnete Antwort. Sie konnten meine schwere Frage verstehen und die richtige Formel geben. Ich werde gerne upvoten, sobald mein Reputation das zulässt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X