声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 33086|回复: 15

[编程技巧] matlab退出循环中return和break有什么差别?

[复制链接]
发表于 2007-1-22 22:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
matlab退出循环中return和break有什么差别?
回复
分享到:

使用道具 举报

发表于 2007-1-22 22:22 | 显示全部楼层
return 退出整个函数体
break  退出循环体

评分

1

查看全部评分

 楼主| 发表于 2007-1-23 18:22 | 显示全部楼层
谢谢
发表于 2009-10-17 21:09 | 显示全部楼层

回复 沙发 yangzj 的帖子

如果两个for循环嵌套,是退出里层的吗?
发表于 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.
发表于 2009-10-18 08:13 | 显示全部楼层
return:从M函数回去
break:退出包含break最里层循环
continue:退出循环的本轮计算,之后执行下一轮循环

评分

1

查看全部评分

发表于 2011-1-17 09:11 | 显示全部楼层
对于嵌套两个for嵌套循环,怎么退出外层循环
发表于 2011-1-17 13:21 | 显示全部楼层
发表于 2011-1-17 13:47 | 显示全部楼层
回复 7 # 笨笨、石头 的帖子

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

评分

1

查看全部评分

发表于 2011-1-18 12:38 | 显示全部楼层
回复 9 # qibbxxt 的帖子

异常处理不是不建议用于流程控制么……
发表于 2011-1-18 17:26 | 显示全部楼层
回复 10 # Rainyboy 的帖子

那除了break和try,还有什么办法可以解决多层循环之间的跳跃吗?
发表于 2011-1-18 21:13 | 显示全部楼层
回复 11 # qibbxxt 的帖子

通过异常的话,大概是这样的:
  1. # -*- coding: cp936 -*-
  2. class JumpException(Exception):
  3.     """为转跳过程定义的异常"""
  4.     def __init__(Self,tag):
  5.         Exception.__init__(Self);
  6.         Self.Tag = tag;
  7. def main():
  8.     for i in range(1,10):
  9.         try:
  10.             for j in range(i,10):
  11.                 for k in range(j,10):
  12.                     for l in range(k,10):
  13.                         for m in range(l,10):
  14.                             try:
  15.                                 for n in range(m,10):
  16.                                     if n == 1:
  17.                                         #在某些情况下只跳出一层
  18.                                         raise JumpException('m');
  19.                                     elif n == m:
  20.                                         #在某些情况下跳出多层
  21.                                         raise JumpException('i');
  22.                             except JumpException, e:
  23.                                 if e.Tag == 'm':
  24.                                     print 'm=',m
  25.                                 else:
  26.                                     raise e;
  27.         except JumpException, e:
  28.             if e.Tag == 'i':
  29.                 print 'i=', i;
  30.             else:
  31.                 print e;
  32. if __name__ == '__main__':
  33.     main();
复制代码




也可以通过中间变量来达到:
  1. def main():
  2.     status = '0';
  3.     for i in range(1,10):
  4.         for j in range(i,10):
  5.             for k in range(j,10):
  6.                 for l in range(k,10):
  7.                     for m in range(l,10):
  8.                         for n in range(m,10):
  9.                             if n == 1:
  10.                                 #在某些情况下只跳出一层
  11.                                 status = 'm';
  12.                                 break;
  13.                             elif n == m:
  14.                                 #在某些情况下跳出多层
  15.                                 status = 'i';
  16.                                 break;
  17.                         if status == 'm':
  18.                             print "m =",m;
  19.                         elif status == '0':
  20.                             continue;
  21.                         else:
  22.                             break;
  23.                     if status == 'l':
  24.                         print "l =",l;
  25.                     elif status == '0':
  26.                         continue;
  27.                     else:
  28.                         break;
  29.                 if status == 'k':
  30.                     print "k =",k;
  31.                 elif status == '0':
  32.                     continue;
  33.                 else:
  34.                     break;
  35.             if status == 'j':
  36.                 print "j =",j;
  37.             elif status == '0':
  38.                 continue;
  39.             else:
  40.                 break;
  41.         if status == 'i':
  42.             print "i =",i;
  43.         elif status == '0':
  44.             continue;
  45.         else:
  46.             break;
复制代码




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

  1. def A(i):
  2.     for j in range(i,10):
  3.         for k in range(j,10):
  4.             for l in range(k,10):
  5.                 for m in range(l,10):
  6.                     re = B(m);
  7.                     if re == 'm':
  8.                         print 'm =',m;
  9.                     elif re == '0':
  10.                         continue;
  11.                     else:
  12.                         return re;
  13.                         
  14.     return '0';

  15. def B(m):
  16.     for n in range(m,10):
  17.         if n == 1:
  18.             #在某些情况下只跳出一层
  19.             return 'm';
  20.         elif n == m:
  21.             #在某些情况下跳出多层
  22.             return 'i';
  23.    
  24. def main():
  25.     status = '0';
  26.     for i in range(1,10):
  27.         if A(i) == 'i':
  28.             print "i =",i;
  29.         else:
  30.             continue;
复制代码



输出的结果都一样:

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




PS:使用直接跳转也行,但是MATLAB好像没有GOTO语句
发表于 2011-1-19 00:48 | 显示全部楼层
Rainyboy 发表于 2011-1-18 12:38
回复 9 # qibbxxt 的帖子

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

不清楚Rainy的本意!?:@)
发表于 2011-1-19 01:11 | 显示全部楼层
回复 13 # ChaChing 的帖子

哦,貌似一些程序设计的书上建议不将异常处理作为流程控制的手段(详细的原因记不清了),个人也不习惯这样用,所以就参与讨论了,呵呵。
发表于 2011-1-19 01:21 | 显示全部楼层
回复 14 # Rainyboy 的帖子

有时可能不得不使用吧!:@)
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-27 13:08 , Processed in 0.119166 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表