将If-Else语句转换为公式

时间:2016-09-29 02:34:53

标签: java algorithm math

我的代码如下:

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

我发现当s(10 - a) = |10 - a| / (10 - a)输出1或-1时。如果1则输出a < 10-1则输出a > 10

然后,我只求解线性方程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
  5. 以A,B,C,D为常数。但是,这并没有给我正确的答案。我做错了什么?

2 个答案:

答案 0 :(得分:4)

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

 f(x, y) = (sign(y - x) + 1) / 2
如果x 年。逆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)

答案 1 :(得分:2)

形式的一般方程式:

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

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

英文: (midpoint between 2 given z values) + (distance from midpoint to either z value)*|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的正确结果。这减少了嵌套条件看起来像更简单的问题

items = [] # Declare a list

# Add items to list
for x in range(1, 4):
    items.append(input("item" + str(x) + ": "))

if all(item == "wood" for item in items):
    print("You created a stick")

假设您知道div { background: #3b9af9; background: -moz-linear-gradient(left, #3b9af9 0%, #3b9af9 32%, #ffffff 32%, #ffffff 64%, #ef1010 64%, #ef1010 100%); background: -webkit-linear-gradient(left, #3b9af9 0%,#3b9af9 32%,#ffffff 32%,#ffffff 64%,#ef1010 64%,#ef1010 100%); background: linear-gradient(to right, #3b9af9 0%,#3b9af9 32%,#ffffff 32%,#ffffff 64%,#ef1010 64%,#ef1010 100%); filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3b9af9', endColorstr='#ef1010',GradientType=1 ); } ,您可以应用上述用于简单案例的相同方法。