设计函数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)

此外,对于任何xy ,假设f(x) = y 。 我们想要f(y) = -x那么。 并且f(f(y)) = -y => f(-x) = -y 。 总结:如果f(x) = y ,则f(-x) = -yf(y) = -xf(-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

上一篇: Designing function f(f(n)) ==

下一篇: Sparse Voxel Octree Smooth Meshing