错误锦集一:循环退出条件(递归退出条件)
来源:互联网 发布:糯米胶品牌 知乎 编辑:程序博客网 时间:2024/05/01 16:24
循环,就是一次一次的重复。许多时候,需要做多次重复的事情,这个时候就需要循环了。循环,给我们带来的极大的简便。不敢想象,世界没有循环和递归的代码会是怎样的!
但是,用循环的时候,一个很重要的事情就是退出条件设置!!!循环虽好,但是不能总在循环里面不出来(不出来就是死循环了)。不过一般而言,不是不出来,而是出不来,就是因为循环退出条件设置有问题。退出条件设置相关的有两个元素:循环变量和比较条件。循环变量一般在循环中不断变化,而比较条件则是循环变量循环变化的极限值(就是循环变量退出时候的达到的值),一般是常量(一般是固定的值,但是有的时候特殊需要也会弄成变量。强烈建议比较条件不要弄成变量,尽量用其他替代方案!)。
由于粗心,好几次都搞成了死循环,在此一一列出。
1、 要注意类型的极值。经常的循环变量是用整数表示,那么比较条件也是一个整数。有一次,用了unsigned char 类型的循环变量,然后比较条件是256.但是,unsigned char的最大值是255,就是说,循环变量是永远小于256的——死循环咯。
建议:这种情况,首先要做的,就是记几个整数的极值,也就几个(1字节的,2字节的,4字节的)。另外,规避方案:该情况一般是用来计数的,个数一般不会太多,所以可以直接用int,应该可以都包含进去了;另外,如果是遍历的话,可以指针+end指针 来作为结束条件。
2、 保证while循环中循环变量在变化。好几次,在写了while之后,在写了一系列do something之后,最后忘了写循环变量变化的代码了(T_T)!当然,还有些情况就是,原来写的好好的,但是,在do something之中有增加了几个if判断,而这里continue的之前,忘了dosomething了。
建议:最完美的解决方案就是用for,该循环的循环变量变化、退出条件都是放在最开始了,之后的do something一般不用管了。当然,如果特殊需要,要用while,那么就养成好习惯:while之后,大括号之后,立马在之中写循环变量变化语句,然后再写do something。Continue之前,一定要写循环变量变化。当然,有些人、或者有些时候,循环变量变化也直接写在while同一行了,比如读文件经常就这么写:while (EOF != (fread(buff,1024,1,fp))){….}
3、 一次循环中,尽量保证循环变量就变化一次!有一次,我退出条件是用的”!=”来判断的,而一次循环中循环变量可能有多次++,最后导致跳过了比较条件那个值,进入死循环。当然,这个可以用”<”,”>”来规避。这样退出没问题了,但是,在循环中的do something可能会做多次,因为循环变量可能会多变化了一次!所以,除非特殊需要,否则建议不要用。
4、 递归。递归,是写的方便,用起来麻烦。思路清晰,实现方便,是递归的优势;但是,一旦有问题,排查起来很麻烦,因为一层一层很多层,很难搞。所以,我一般对递归是敬而远之。至于用递归,要注意的地方,我觉得还是退出条件。退出条件,我没有什么特别好的建议。但是,如果没信心,那么我建议用个计数器记录深度,每递归一次,加1,如果达到一定的深度,那么就直接return,退出的时候,也可以-1(根据需要)。这样,至少深度不会死循环。当然,如果需要,广度上也可以设个计数的。
- 错误锦集一:循环退出条件(递归退出条件)
- 递归退出的条件
- 入口条件循环和退出条件循环
- 递归调用---注意什么条件退出递归
- for循环不加退出条件、equals的作用
- for循环不加退出条件、equals的作用
- hdu1072(bfs搜索退出的条件有变)
- C#基础-019 随机数、清屏、退出、循环、条件语句综合实例
- 随机生成一个对称矩阵,并输出。(究极版本,可以每一次都改变矩阵的随机数且不同,采用do while退出条件循环)
- 循环条件
- 条件,循环
- 循环&条件
- 退出当前循环和退出循环
- for循环,循环条件
- 努力退出while循环!
- while循环退出
- 循环退出时机
- java退出for循环
- 小波变换网文精粹:小波变换教程(八)
- UITableView 详细讲解
- oracle里面写脚本把一个表里的数据做处理导入另一个表
- 错误500-内部服务器错误害死人
- 详解linux下wget的用法
- 错误锦集一:循环退出条件(递归退出条件)
- oracle中的 resetlogs+scn恢复
- javascript截断指定位数的浮点数的小知识
- bash shell (2) 特殊符号变量
- 网络驱动移植之sk_buff结构体及其相关操作函数(下)
- 页面上的JS文件加载失败!
- Linux内核入门(一)——体系架构
- 拖动效果的一个实现方案
- 内存数据库的分布式数据库架构