2010-07-17 2564 views
2

我有这个算法,但我并不太热衷于很多if语句。这个算法可以简化(书写更清晰)吗?

有人可以看到,如果这个功能可以写得更干净吗?

rand('twister',101) 

n = 10; 
f = A.^(0:n)./factorial(0:n); 
f = f/sum(f); 
n = 10000; 
Xi = 2; 
X = zeros(1,n); 

for i =1:n, 
    dXi = (-1)^round(rand); 
    Yi = Xi + dXi; 
    if Yi > 0 & Yi <= length(f), 
     if f(Yi) >= f(Xi), 
      X(i) = Yi; 
      Xi = Yi; 
     else 
      if rand <= f(Yi)/f(Xi), 
       X(i) = Yi; 
       Xi = Yi; 
      else 
       X(i) = Xi; 
      end 
     end 
    end 
    X(i) = Xi; 
end 
+0

这是什么做?考虑到要求,它可能已经尽可能简单。 – 2010-07-17 21:16:04

+1

循环结尾处的X(i)= Xi看起来像一个错误。如果不是这样,嵌套ifs中有很多不必要的东西,其中X(i)暂时分配给其他东西,然后从未使用过。如果声明设置Xi = Yi,你可以将其简化为一个。 – 2010-07-17 21:36:13

+0

最后的X(i)= Xi是打算的。但我不太关注你,什么是从未用过的? – 2010-07-17 21:43:47

回答

1

我不知道Matlab的语法,但通常是这样的:

if (cond1) then 
    mainAction 
else if (cond2) then 
     mainAction 
    else 
     otherAction 

可以简化为:

if (cond1 OR cond2) then 
    mainAction 
else 
    otherAction 

OR将不得不short-circuiting为一个确切的,但如果cond2没有副作用,那么它并不重要。

1

这可以通过注意到,只要你做X(i) = Yi你也Xi = Yi简化,因此你可以只在循环结束时分配一次X(i)。这允许很多其他逻辑简化。

另请注意,if语句末尾的,实际上只在单行if语句中是必需的,例如,

if x < y, do_something, else do_something_else, end 

无论如何,我得到这个(你可以进一步简化为一个if语句,但也许这是不太清楚而且有一个以上的if语句允许在特定部分的断点。):

for i =1:n, 
    dXi = (-1)^round(rand); 
    Yi = Xi + dXi; 
    if Yi > 0 & Yi <= length(f) 
     if f(Yi) >= f(Xi) || rand <= f(Yi)/f(Xi) 
      Xi = Yi; 
     end 
    end 
    X(i) = Xi; 
end