我有以下伪代码:
for j = 0 to argmax {l where t mod 2^l = 0} do
t是一个在此for循环之外递增的计数器。我的问题是如何评估argmax声明?
我相信'我'在代码中是一个错字。 '吨'可能是对的。
答案 0 :(得分:3)
没有封闭式argmax
功能。
Argmax说找 最大化函数的参数(参数)。
如果你在语句中有一个复杂的表达式,那么这可能是任意复杂的。
在这里,它可以实现为单行数学表达式,作者因为行长而懒得拼出。否则,如果您有一个有限整数域,则可以使用循环实现它:
def argmaximod2l(maxl, i):
for l in range(maxl, 0, -1):
if i % (2**l) == 0: return l
raise Exception("No l was divisible by i.")
如果你有两个整数,你可以使用嵌套循环;如果你的参数是双倍的并且你有一个平滑的凸函数,你可以使用梯度下降方法。
在这种特殊情况下,最大l
应该是i
的尾随零的数量。有更高效的方法(可能还有一个库函数,例如Java中的Long.numberOfLeadingZeros
)。
在这种特殊情况下,您可能希望将循环实现为:
for (int j=0, i=t; (i&1)==0; j++, i>>>=1) {
...
}
答案 1 :(得分:1)
我不确定我是否得到了你的问题的要点?
for (int j = 0; j < argmax; j++) {...}
因为argmax是一个函数,所以
for (int j = 0; j < argmax(); j++) {...}
private int argmax () {return some int}
答案 2 :(得分:1)
不是将argmax作为一个函数实现,甚至不直接计算argmax,我认为这样做会更简单:
int j=0;
for(int s=t*2; s%2==0; s/=2){
// loop code goes here
j++;
}