Mil*_*les 23
对于第一部分:这个比f(f(x))= -x,IMO更简单:
float f(float x)
{
return x >= 0 ? -1.0/x : -x;
}
Run Code Online (Sandbox Code Playgroud)
第二部分是一个有趣的问题,也是这个问题所基于的原始问题的明显概括.有两种基本方法:
ram*_*ion 12
好吧,这是C快速黑客:
extern double f(double x);
double g(double x)
{
static int parity = 0;
parity ^= 1;
return (parity ? x : f(x));
}
Run Code Online (Sandbox Code Playgroud)
但是,如果你这样做,这会破坏:
a = g(4.0); // => a = 4.0, parity = 1
b = g(2.0); // => b = f(2.0), parity = 0
c = g(a); // => c = 4.0, parity = 1
d = g(b); // => d = f(f(2.0)), parity = 0
Run Code Online (Sandbox Code Playgroud)
一般来说,如果f是双射f:D→D,你需要的是一个函数σ,它将域D划分为A和B,这样:
然后,你可以这样定义g:
这适用于b/c
你可以从Miles回答看,如果我们忽略0,那么操作σ(x)= -x适用于f(x)= 1/x.您可以检查1-6(对于D =非零实数),A为正数,B为负数.使用双精度标准,有a +0,a -0,a +inf和a -inf,这些可用于使域总数(适用于所有双精度数,而不仅仅是非零).
同样的方法可以应用于f(x)= -1问题 - 使用σ(x)=(x - 1),通过余数mod 2对空间进行分区的接受解决方案,特别处理零情况.
Joe*_*orn 11
我喜欢早期帖子中的javascript/lambda建议:
function f(x)
{
if (typeof x == "function")
return x();
else
return function () {return 1/x;}
}
Run Code Online (Sandbox Code Playgroud)