関数 f(f(n)) == -n の設計 質問する

関数 f(f(n)) == -n の設計 質問する

前回の面接で受けた質問:

f次のような関数を設計します。

f(f(n)) == -n

n32 ビットの符号付き整数です。複素数演算は使用できません。

数値の全範囲に対してこのような関数を設計できない場合は、可能な限り最大の範囲に対して設計してください。

何か案は?

ベストアンサー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()

おすすめ記事