近来观《编程之美》,收获颇多,整体上还是值得称道的,对读者思维的拓展和看问题的角度助益甚多,确能体会到编程之“美”,余观“一摞烙饼的排序”,感觉甚“爽”。但读此书过程中,发现此书略有瑕疵,虽瑕不掩瑜,还是决定在此予以指出(当然也可能是我弄错了呀):
1、本书风格不统一,建议代码全部改为伪码。
2、表述不够流畅,愿多加润色。
3、结构之法这章太简单。
4、发现书中的一些错误(打字错误就不在此指出了)和可以优化的地方,现贴在此:
(1)、在”NIM(3)两堆石头的游戏“中,代码有逻辑错误,下面是改正之后的代码(错误在注释中予以说明了):
#include <iostream> #include <vector> #include <cmath> using namespace std; bool nim(int x, int y) { if(x == y) return true; if (x > y) { swap(x, y); } if (x == 1 && y == 2) { return false; } vector<int> iv; iv.push_back(2); int delta = 1; int n = 1; int b = 2; int addition = 0; while (x > n) { while (find(iv.begin(), iv.end(), ++n) != iv.end()); ++delta; ++addition; b = n + delta; iv.push_back(b); if (iv.size() > 2 && addition >= 100) { iv.erase(remove_if(iv.begin(), iv.end(), bind2nd(less<int>(), n)), iv.end()); addition = 0; } } if ((x != n) || y != b) { //y != b 为改正之后的代码 return true; } return false; } void tester1(int x, int y) { if (nim(x, y)) { cout<<"("<<x<<", "<<y<<") Can Win"<<endl; }else{ cout<<"("<<x<<", "<<y<<") Will lose"<<endl; } } bool nim2(int x, int y) { if (x == y) { return true; } if (x > y) { swap(x, y); } double a = (1 + sqrt(5.0)) / 2; return x != (int)floor((y - x) * a); } void tester2(int x, int y) { if (nim2(x, y)) { cout<<"("<<x<<", "<<y<<") Can Win"<<endl; }else{ cout<<"("<<x<<", "<<y<<") Will lose"<<endl; } } int main(int argc, const char * argv[]) { cout<<"The Tester1:"<<endl; tester1(1, 2); tester1(3, 5); tester1(3, 6); tester1(8, 10); tester1(8, 13); tester1(50, 50); tester1(5000, 5555); cout<<"The Tester2:"<<endl; tester2(1, 2); tester2(3, 5); tester2(3, 6); tester2(8, 10); tester2(8, 13); tester2(50, 50); tester2(5000, 5555); return 0; }