三、 程序思路错误
(一) 方法一(推荐):观察变量变化
例如下面是一个最基础的二分算法的函数写法(想学该算法请转向luogu),初学该算法时常常会出现不知道该怎么写left和right判断条件的情况从而导致程序无法运行
以下就是一个非常经典的二分算法的问题程序:该程序运行后会出现while语句无法跳出导致运行文件无法结束的问题
inline int halff(){ int l=maxx,r=ans; while(l<=r){ int mid=(l+r)>>1; if(checkk(mid)) r=mid; else l=mid+1; } return r; }
运行结果如下:
那如何知道自己的程序错误在哪里呢?
一个有效的方法是在循环中的每一步都将变量的值输出
这样就可以通过观察变量值的变化对程序的运行过程有一个大致的了解
inline int halff(){ int l=maxx,r=ans; while(l<=r){ cout<<l<<" "<<r<<endl; //这一步就是在输出变量 int mid=(l+r)>>1; if(checkk(mid)) r=mid; else l=mid+1; } return r; }
运行结果如下:
我们就可以看到,的情况在不断地发生从而导致循环无法跳出,因此我们只需要将改为即可
更改后的程序如下:
inline int halff(){ int l=maxx,r=ans; while(l<r){ //这里进行了更改 cout<<l<<" "<<r<<endl; int mid=(l+r)>>1; if(checkk(mid)) r=mid; else l=mid+1; } return r; }
运行结果如下:
可以看到在几次二分后程序完成了二分定位24的任务并成功跳出了while()循环,差错完成
此时我们不需要输出变量值了就可以将输出语句删掉或注释掉(直接加上//)
inline int halff(){ int l=maxx,r=ans; while(l<r){ //cout<<l<<" "<<r<<endl; int mid=(l+r)>>1; if(checkk(mid)) r=mid; else l=mid+1; } return r; }
运行结果如下:
我们可以再强调一遍:
对初学者来说,想要认识到一个程序的运行过程或错误,最有效的方法之一就是在循环中的每一步都将变量的值输出
(题外话:有些老师在教算法时会要求初学者背下整个代码块,我看法正好相反。计算机学科不是语文、历史,背书对你的能力只有负作用!计算机充满着天马行空的想象思维,学计算机千万不可把你的思路限制死了)