Hier ist ein kurze Python-Antwort :
def f(n):
m = -n if n % 2 == 0 else n
return m + sign(n)
Allgemeiner Fall
Mit einer leichten Änderung der obigen Formulierung kann der Fall behandelt werden, dass wir k
Selbstaufrufe, um die Eingabe zu negieren - zum Beispiel, wenn k = 3
würde dies bedeuten g(g(g(n))) = -n
:
def g(n):
if n % k: return n + sign(n)
return -n + (k - 1) * sign(n)
Dies funktioniert, indem man 0 an Ort und Stelle lässt und Zyklen der Länge 2 * k erzeugt, so dass innerhalb eines Zyklus n und -n den Abstand k haben. Konkret sieht jeder Zyklus so aus:
N * k + 1, N * k + 2, ... , N * k + (k - 1), - N * k - 1, ... , - N * k - (k - 1)
oder, um das Verständnis zu erleichtern, sind hier Beispielzyklen mit k = 3
:
1, 2, 3, -1, -2, -3
4, 5, 6, -4, -5, -6
Dieser Satz von Zyklen maximiert die Bereiche von Eingaben, die mit jedem Maschinentyp funktionieren, der um Null herum zentriert ist, wie z. B. die Typen int32 mit Vorzeichen oder int64 mit Vorzeichen.
Analyse der kompatiblen Bereiche
Die Karte x -> f(x)
müssen in der Tat Zyklen der Länge 2 * k
, wobei x = 0
ist ein Spezialfall eines Zyklus der Länge 1, da -0 = 0. Das Problem für allgemeine k
ist dann und nur dann lösbar, wenn der Bereich der Eingabe - 1 (zum Ausgleich von 0) ein Vielfaches von 2 * k ist und der positive und der negative Bereich einander entgegengesetzt sind.
Bei vorzeichenbehafteten Ganzzahlendarstellungen gibt es immer eine kleinste negative Zahl ohne positives Gegenstück im Bereich, so dass das Problem für den gesamten Bereich unlösbar wird. Zum Beispiel, eine signed char
hat den Bereich [-128, 127], also ist es unmöglich, dass f(f(-128)) = 128
innerhalb des angegebenen Bereichs.
6 Stimmen
Um welche Stelle ging es bei diesem Vorstellungsgespräch?