前回の面接で受けた質問:
f
次のような関数を設計します。f(f(n)) == -n
は
n
32 ビットの符号付き整数です。複素数演算は使用できません。数値の全範囲に対してこのような関数を設計できない場合は、可能な限り最大の範囲に対して設計してください。
何か案は?
ベストアンサー1
どのような言語を期待しているかは述べていませんが... 静的ソリューション (Haskell) を以下に示します。基本的には、最も重要な 2 つのビットを操作します。
f :: Int -> Int
f x | (testBit x 30 /= testBit x 31) = negate $ complementBit x 30
| otherwise = complementBit x 30
動的言語 (Python) では、はるかに簡単です。引数が数値 X であるかどうかを確認し、-X を返すラムダを返すだけです。
def f(x):
if isinstance(x,int):
return (lambda: -x)
else:
return x()