关于程序算法手动演算手推及演草
读程序或者算法的时候,有经验的人可能多看几步,但是没有谁能看几十甚至几百步的,程序我们知道是一句一句执行的,在调试的时候叫单步执行,程序是存在跳转和分支的,在考试的时候经常要回答结果以考察对算法的分析能力,又不能带个笔记本到考场,所以程序要通过在草稿纸上手推,最好不要心算,手算麻烦一些,但是每一步的结果都写在纸上,不会出错。
这个是个数组循环右移的程序
#include <iostream> #include <vector> using namespace std; int main() { vector<int> v; v.push_back(2); v.push_back(8); v.push_back(4); v.push_back(3); v.push_back(9); for (int i = 0; i < 3; i++) { int t = v[4]; for (int j = 4; j >= 1; j--) { v[j] = v[j-1]; } v[0] = t; } for (int i = 0; i < 5; i++) { cout << v[i] << " "; } return 0; }
对于中间的两个for循环,我们加上行号
10 for (int i = 0; i < 3; i++) 11 { 12 int t = v[4]; 13 for (int j = 4; j >= 1; j--) 14 { 15 v[j] = v[j-1]; 16 } 17 v[0] = t; 18 }
下面就来在草稿纸上单步运行,变量没变或者自己知道多少就不写
10: i = 0; v=[2 8 4 3 9] 12: t = 9; 13: j = 4 15: v = [2 8 4 3 3] 13: j = 3 15: v = [2 8 4 4 3] 13: j = 2 15: v = [2 8 8 4 3] 13: j = 1 15: v = [2 2 8 4 3] 13: j = 0 17: v = [9 2 8 4 3]
这个下面就不用再执行下去了,可以发现这个for(j..就是再向右转一个数,这样i = 1 i = 2以后,v应该是[4 3 9 2 8]
其实算法程序就像数学应用题先找到一个公式或者一个代数方程组,然后把参数带进去一步一步算,得到结果,反之,这个手演算
的过程也可以启发编算法和找到更好的算法,有些是心里面心算或者叫运筹和手算也可以叫沙盘推演结合的