这是一篇本来不应该存在的程序,但是有了世界之大,就有这一段程序,如果你同情我的遭遇,那么进来帮我改进一下,大家一起交流讨论一下吧,我谢谢大家了。
背景
这个事情发生在五个月前的3月2日,详细内容请看下面链接:
http://t.csdn.cn/ZBOMh
这不过了5个月嘛,发现说我之前写的东西,如果目标值是负数,就会出现死循环,一开始我是不信的,直到我自己尝试了一下,果然......怪我不严谨了,之前的那个就认为是正数增函数的单变量求解吧,于是我就又得去找我之前代码的原因了。
我发现一个问题,举个例子来说f(x) = x+3这个函数,是个增函数,如果f(x)值是-6.6,我之前的代码就会进入死循环,于是我就开始找死循环的进入点,最后发现,居然在第一步就进入了死循环... ...俗话说这万事开头难,我也没想到会是这么难!
修改
经过深思熟虑之后,我定下了一个规矩,既然这个f(x)亦正亦邪,那就索性规定,所有的左值都必须是负数,所有的右值都必须是正数,这一下我看你还怎么嘚瑟!
其余代码没动,只把寻找左右值的代码小改动了一下:
if(f(x) < target){
left = x>0?-x:x;
do{
x*=10;
} while(f(x>0?x:-x) < target);
right = x>0?x:-x;
} else{
right = x<0?-x:x;
do{
x*=10;//注意这里,因为是负数了,所以不能用除法来缩小了
} while(f(x<0?x:-x) > target);
left = x<0?x:-x;
}
上面这个代码是改过之后的代码,咱们再来看看改之前的代码:
if(f(x) < target){
left = x;
do{
x*=10;
} while(f(x) < target);
right = x;
} else{
right = x;
do{
x/=10;
} while(f(x) > target);
left = x;
}
代码行数没变,就是对于左右值进行了一个限制。代码里面的x*10也可以换成其他的函数,只要是能找到两个边界的,就都是好函数,我用了这个x*10自然是有我的原因,因为就是图方便。
之前的代码里面没有考虑到最终结果是负数这么一种情况,主要原因是什么呢,就是这个使用场景吧,最终的目标是预期收入,谁能把预期收入设置为负数!想着自己赔钱呢?这不搞笑吗?钱不想要给我啊。再一个,我也确实没有考虑到负数的情况,谁也保不齐有的人,他就像做“慈善”呢!
总结
这个玩意目前我是觉得没问题了,谁知道实际用的时候会是个什么效果,毕竟用的人不是我。当我把这个修改告诉对象后,至今没有得到一个答复,我真是... ...