heaventian 发表于 2007-1-22 22:17

matlab退出循环中return和break有什么差别?

matlab退出循环中return和break有什么差别?

yangzj 发表于 2007-1-22 22:22

return 退出整个函数体
break退出循环体

heaventian 发表于 2007-1-23 18:22

谢谢

ldlnihao 发表于 2009-10-17 21:09

回复 沙发 yangzj 的帖子

如果两个for循环嵌套,是退出里层的吗?

ChaChing 发表于 2009-10-18 00:29

回复 地板 ldlnihao 的帖子

Yes
From Help
break terminates the execution of a for or while loop. Statements in the loop that appear after the break statement are not executed.
In nested loops, break exits only from the loop in which it occurs. Control passes to the statement that follows the end of that loop.

VibrationMaster 发表于 2009-10-18 08:13

return:从M函数回去
break:退出包含break最里层循环
continue:退出循环的本轮计算,之后执行下一轮循环

笨笨、石头 发表于 2011-1-17 09:11

对于嵌套两个for嵌套循环,怎么退出外层循环

ljelly 发表于 2011-1-17 13:21

笨笨、石头 发表于 2011-1-17 09:11 static/image/common/back.gif
对于嵌套两个for嵌套循环,怎么退出外层循环

在第一个循环体外,外层循环体内加break

qibbxxt 发表于 2011-1-17 13:47

回复 7 # 笨笨、石头 的帖子

多层循环之间跳的话,可以用try……catch

Rainyboy 发表于 2011-1-18 12:38

回复 9 # qibbxxt 的帖子

异常处理不是不建议用于流程控制么……

qibbxxt 发表于 2011-1-18 17:26

回复 10 # Rainyboy 的帖子

那除了break和try,还有什么办法可以解决多层循环之间的跳跃吗?

Rainyboy 发表于 2011-1-18 21:13

回复 11 # qibbxxt 的帖子

通过异常的话,大概是这样的:# -*- coding: cp936 -*-
class JumpException(Exception):
    """为转跳过程定义的异常"""
    def __init__(Self,tag):
      Exception.__init__(Self);
      Self.Tag = tag;
def main():
    for i in range(1,10):
      try:
            for j in range(i,10):
                for k in range(j,10):
                  for l in range(k,10):
                        for m in range(l,10):
                            try:
                              for n in range(m,10):
                                    if n == 1:
                                        #在某些情况下只跳出一层
                                        raise JumpException('m');
                                    elif n == m:
                                        #在某些情况下跳出多层
                                        raise JumpException('i');
                            except JumpException, e:
                              if e.Tag == 'm':
                                    print 'm=',m
                              else:
                                    raise e;
      except JumpException, e:
            if e.Tag == 'i':
                print 'i=', i;
            else:
                print e;
if __name__ == '__main__':
    main();



也可以通过中间变量来达到:
def main():
    status = '0';
    for i in range(1,10):
      for j in range(i,10):
            for k in range(j,10):
                for l in range(k,10):
                  for m in range(l,10):
                        for n in range(m,10):
                            if n == 1:
                              #在某些情况下只跳出一层
                              status = 'm';
                              break;
                            elif n == m:
                              #在某些情况下跳出多层
                              status = 'i';
                              break;
                        if status == 'm':
                            print "m =",m;
                        elif status == '0':
                            continue;
                        else:
                            break;
                  if status == 'l':
                        print "l =",l;
                  elif status == '0':
                        continue;
                  else:
                        break;
                if status == 'k':
                  print "k =",k;
                elif status == '0':
                  continue;
                else:
                  break;
            if status == 'j':
                print "j =",j;
            elif status == '0':
                continue;
            else:
                break;
      if status == 'i':
            print "i =",i;
      elif status == '0':
            continue;
      else:
            break;



但是上面的代码有些冗余,因为实际上只需要在个别层之间跳转,可以将需要跳转的地方封装成函数:

def A(i):
    for j in range(i,10):
      for k in range(j,10):
            for l in range(k,10):
                for m in range(l,10):
                  re = B(m);
                  if re == 'm':
                        print 'm =',m;
                  elif re == '0':
                        continue;
                  else:
                        return re;
                        
    return '0';

def B(m):
    for n in range(m,10):
      if n == 1:
            #在某些情况下只跳出一层
            return 'm';
      elif n == m:
            #在某些情况下跳出多层
            return 'i';
   
def main():
    status = '0';
    for i in range(1,10):
      if A(i) == 'i':
            print "i =",i;
      else:
            continue;


输出的结果都一样:

m = 1
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9




PS:使用直接跳转也行,但是MATLAB好像没有GOTO语句

ChaChing 发表于 2011-1-19 00:48

Rainyboy 发表于 2011-1-18 12:38 static/image/common/back.gif
回复 9 # qibbxxt 的帖子

异常处理不是不建议用于流程控制么……

不清楚Rainy的本意!?:@)

Rainyboy 发表于 2011-1-19 01:11

回复 13 # ChaChing 的帖子

哦,貌似一些程序设计的书上建议不将异常处理作为流程控制的手段(详细的原因记不清了),个人也不习惯这样用,所以就参与讨论了,呵呵。

ChaChing 发表于 2011-1-19 01:21

回复 14 # Rainyboy 的帖子

有时可能不得不使用吧!:@)
页: [1] 2
查看完整版本: matlab退出循环中return和break有什么差别?