将If-Else语句转换为公式

5
我有如下代码:

我有以下代码:

`if (a <= 10){
    z = 5;
 } else {
    z = -1;
 }`

我发现当s(10 - a) = |10 - a| / (10 - a)时,它会输出1或-1。如果a < 10,则输出1;如果a > 10,则输出-1
然后,我解决了线性方程z = s(10 - a) * m + b,以找到常量m和b。 5 = 1 * m + b-1 = -1 * m + b 得出b = 2,m = 3
然后,这可以被建模为z = 3 * s(10 - a) + 2
现在问题变得更加棘手。如果我有两个嵌套在if语句中的变量呢?例如:
`if (a <= 10){
    if(b <= 3){
       z = 3;
    } else {
       z = 1;
    }
 } else {
    if(b <= -5){
       z = -11;
    } else {
     z = 4;
    }
}`

我尝试使用另一系列线性方程来解决这个问题。
  1. 3 = A * s(10 - a) + B * s(3 - b) + C
  2. 1 = A * s(10 - a) + B * s(3 - b) + C
  3. -11 = A * s(10 - a) + D * s(-5 - b) + C
  4. 4 = A * s(10 - a) + D * s(-5 - b) + C
其中A、B、C、D为常数。然而,这并没有给我正确的答案。我做错了什么?

我得到了一个方程式:z = (11/4) * s(10 - a) + s(3 - b) - (3/4) - (15/2) * s(-5 - b)。 - Steven
我可能是在说显而易见的事情,但是第一个公式并不真正等同于if-else语句,因为当a为10时会出现除以0的情况。 - maraca
@shole 我觉得这样做可能会有用。z = A * s(10 - a) + (B * s(3-b) OR D * s(-5 - b)) + C,只使用一个“b”函数。 - Steven
数学家们有一个if语句,但我猜把公式写成这样可能是作弊的http://math.stackexchange.com/questions/611792/mathematical-if-else-statement,但是我认为这个问题不是关于算法的,所以你可能会从数学交流中得到更多帮助。 - maraca
@maraca 我查看了网上几乎所有的问题,但是当涉及到嵌套语句时,我找不到太多有用的信息。我真的卡住了。 - Steven
显示剩余10条评论
2个回答

7

如果语句可以通过使用以下技巧转换为公式:我们需要找到一种公式,如果if语句为真,则为1,否则为0。我们可以使用符号函数:

 f(x, y) = (sign(y - x) + 1) / 2

f(x, y)表示当x小于y时为1,当x大于y时为0。反函数g(x, y) = 1 - f(x, y)。

因此,我们可以轻松地将这两个公式组合起来:

f(a, 10) * (f(b, 3) * 3 + g(b, 3) * 1) + g(a, 10) * (f(b, -5) * -11 + g(b, -5) * 4)

太棒了。谢谢你。 - Steven

2

一个一般形式的方程:

((z2+z1)/2) + (|z2-z1|/2)*f(a,b)

其中,f(a,b) = |a-b|/(a-b)

翻译成英文为:(两个给定的z值的中点) + (从中点到任意一个z值的距离)*|a-b|/(a-b)

在原始示例中尝试这个方程:

if (a <= 10){
    z = 5;
 } else {
    z = -1;
 }

你得到:

z1=5 z2=-1

f(a,b)=f(10,a)=|10-a|/(10-a)

将它们代入...

((5-1)/2) + (|5-(-1)|/2)*|10-a|/(10-a)

简化为最初的形式z = 3 * s(10 - a) + 2

当应用于嵌套条件语句时:

if (a <= 10) {
  ... // z1
} else {
  ... // z2
}

对于 z1,我得到了这个公式:z1 = 2 + |3-b|/(3-b)

而对于 z2,我得到了这个公式:-3.5 + 7.5*(|-5-b|/(-5-b))。尽管 z1 看起来没问题,但是 z2 似乎不行,因为如果你尝试 b=0 ,你会得到 z2=-3.5 - 7.5*(1),但是因为 0 > -5 ,你期望得到 z2=4 ,因为:

if (b <= -5) {
  z = -11;
} else {
  z = 4;
}

为了得到正确的表达式,我交换了 f(a,b) = |a-b|/(a-b) 的定义为 f(a,b) = |b-a|/(b-a),新的结果是 z2 = -3.5 + 7.5*(|b+5|/(b+5)),测试 b=0 得到正确的结果为 4。这将嵌套条件简化为一个更简单的问题。
if (a <= 10) z =  2 + |3-b|/(3-b)

else z = -3.5 + 7.5*(|b+5|/(b+5))

假设您已经了解b,则可以应用上述简单情况所使用的相同方法。

谢谢。我选择了第一个发布的答案,但这个也非常有帮助。 - Steven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接