设计函数f(f(n))==
我在最后一次采访中遇到了一个问题:
设计一个函数f
,使得:
f(f(n)) == -n
其中n
是一个32位有符号整数 ; 你不能使用复数算术。
如果您无法为整个数字范围设计这样的功能,请尽可能将其设计为最大范围。
有任何想法吗?
怎么样:
f(n) = sign(n) - (-1)n * n
在Python中:
def f(n):
if n == 0: return 0
if n >= 0:
if n % 2 == 1:
return n + 1
else:
return -1 * (n - 1)
else:
if n % 2 == 1:
return n - 1
else:
return -1 * (n + 1)
Python会自动将整数提升为任意长度。 在其他语言中,最大的正整数将溢出,所以它将适用于除那一个之外的所有整数。
为了使它适用于实数, { ceiling(n) if n>0; floor(n) if n<0 }
需要用{ ceiling(n) if n>0; floor(n) if n<0 }
替换(-1)n中的{ ceiling(n) if n>0; floor(n) if n<0 }
{ ceiling(n) if n>0; floor(n) if n<0 }
。
在C#中(适用于任何双精度,溢出情况除外):
static double F(double n)
{
if (n == 0) return 0;
if (n < 0)
return ((long)Math.Ceiling(n) % 2 == 0) ? (n + 1) : (-1 * (n - 1));
else
return ((long)Math.Floor(n) % 2 == 0) ? (n - 1) : (-1 * (n + 1));
}
你没有说他们期待什么样的语言......这是一个静态解决方案(Haskell)。 它基本上与最重要的两个比特相混淆:
f :: Int -> Int
f x | (testBit x 30 /= testBit x 31) = negate $ complementBit x 30
| otherwise = complementBit x 30
动态语言(Python)更容易。 只需检查参数是否为数字X并返回一个返回-X的lambda:
def f(x):
if isinstance(x,int):
return (lambda: -x)
else:
return x()
对于所有数字,如果它不使用额外的信息(32位int除外),这是一个证明为什么这样的函数不能存在的原因:
(证明:假设f(0)= x,那么f(x)= f(f(0))= -0 = 0.现在,-x = f(f(x ))= f(0)= x,这意味着x = 0)
此外,对于任何x
和y
,假设f(x) = y
。 我们想要f(y) = -x
那么。 并且f(f(y)) = -y => f(-x) = -y
。 总结:如果f(x) = y
,则f(-x) = -y
, f(y) = -x
, f(-y) = x
。
因此,我们需要将除0以外的所有整数分成4组,但我们有这样的整数奇数; 不仅如此,如果我们删除没有正数的整数,我们仍然有2(mod4)数字。
如果我们删除剩余的2个最大数(通过abs值),我们可以得到这个函数:
int sign(int n)
{
if(n>0)
return 1;
else
return -1;
}
int f(int n)
{
if(n==0) return 0;
switch(abs(n)%2)
{
case 1:
return sign(n)*(abs(n)+1);
case 0:
return -sign(n)*(abs(n)-1);
}
}
当然,另一种选择是不遵守0,并获得我们删除的2个数字作为奖励。 (但是,如果这只是一个愚蠢的做法。)
链接地址: http://www.djcxy.com/p/37193.html