我遇到了问题并尝试解决了几个小时。这是一个伪代码:
x = 30
if x > 100 then max(function_1(x), function_2(x))
elseif x > 50 then max(function_3(x), function_4(x))
elseif x > 20 then max(function_5(x), function_6(x))
elseif x < 10 then function_7(x)
else function_8(x)
这是我使用x
的不同值运行的代码。然后函数是数学公式。现在,我对每个x
都有上述结果,我想恢复并再次返回x
。
我找到了所有相反的函数数学公式。例如,对于function_1(x)
,我有一个rev_function_1(y)
来获得结果,并会给我初始x
。
但是,由于原始代码有很多情况,加上MAX
,我不知道如何为每个值运行一个代码并返回原始代码。
修改:所有功能都是一对一的
Edit2:似乎整个函数都不是one-to-one
,而每个函数都是x
。因此,每y
我有两个def join("users:" <> user_id, _params, socket) do
{user_id, _} = Integer.parse(user_id)
%{id: id} = socket.assigns[:user]
#prevent connection to solo channel of other users, but allow in development
case id == user_id || Mix.env == :dev do
true ->
{:ok, socket}
false ->
{:error, "This is not your solo channel!"}
end
end
,我无法将其还原。
答案 0 :(得分:2)
您需要研究函数的结果空间(或域)。
只有当每个x导致对于x的任何其他值无法获得的唯一f(x)时,才存在逆。此属性称为one-to-one
让我举个例子:
我们说f(1) == 8
和f(10) == 8
。
那么您不知道8
的倒数是1
还是10
。
如果函数是one-to-one
,则逆将是唯一值。如果它不是一对一,则逆可能不止一个值。
下一步是找出要调用的反转。
一种方法是调用所有子功能的反转。
对于您获得的每个x
值,请计算f(x)
。如果f(x)
返回您想要反转的值,则保留x
,否则将其丢弃。
当您浏览完所有值后,您将拥有一个(或多个)匹配的x
值。
修改强>
另一种方法是预先计算对应于某个输出值间隔的函数。您可以将它们作为元组存储在数据库中:
lowerbound, upperbound, inverse_function
然后,您可以找到要使用的函数(假设SQL):
SELECT inverse_function FROM lookup_table
WHERE :fx > lowerbound and :fx < upperbound
:fx
是您要反转的值。
答案 1 :(得分:0)
每个x都有一个输出y。如果两个x产生相同的y,那么你就无法撤消映射,因为y可能来自x。如果没有两个x产生相同的y,那么你知道它来自y的x。
答案 2 :(得分:0)
NOTE: Since a reverse algorithm is required and OP have not made mandatory to use the original functions or their corresponding reverse functions so following method can be used.
“现在,我对每个x都有上述结果,我想恢复并再次回到x。”。它似乎是[Key] =&gt;的一个例子。 [数值]。
//one-to-many case.
if x > 100 then max(function_1(x), function_2(x))
elseif x > 50 then max(function_3(x), function_4(x))
上面的代码告诉我们,多个不同的输入"x"
可以产生相同的输出"y"
。
因此,如果您使用的是C ++,则可以使用std::multimap。
现在multimap
可以直接在输入输出级别使用,也就是说,如果给定输入"x"
并且在运行所有公式之后产生输出"y"
,则{{1} }
因此,现在给出输出multimap.insert(std::pair<int,int>(y,x));
,您可以找到所有可能产生输出"y"
的预期输入"x"
,如下所示:
"y"
如果输入std::pair <std::multimap<int,int>::iterator, std::multimap<int,int>::iterator> ret;
ret = multimap.equal_range(y);
for (std::multimap<int,int>::iterator it=ret.first; it!=ret.second; ++it)
std::cout << ' ' << it->second;
与其对应的"x"
之间的关系为"y"
,则可以使用std::map。
答案 3 :(得分:0)
我认为这是不可能的,让我们来看看这个例子
function_1(x)= x - 200
function_2(x)= x - 201
function_7(x)= x - 5
那么对于x = 200 =&gt; y = 0且x = 5 =&gt; y = 0
因此,对于给定的y值,我们可以有多个x
答案 4 :(得分:-1)
一般情况下没有解决方案。想想这套公式:
function_1(x) { return x }
function_2(x) { return x }
function_3(x) { return x }
....
我想很明显为什么它不起作用。