
程序设计
五道口纳什
wx公众号/B站:五道口纳什
展开
-
代码重构 —— 区分代码和数据
string getMonthName(int month){ if (month == 1) return "January"; if (month == 2) return "February"; ... return "December";}有了经验和常识之后,大多数人都会避免写出这样的代码。因为与代码逻辑无关的数据应尽可能区分开来。(便于进一步的替换和原创 2016-04-28 12:03:39 · 1189 阅读 · 0 评论 -
程序思维
程序思维,本质上是计算机的思维。计算思维与人的思维有相似的地方,但又不完全一致,设置起始以及遍历结束的位置,规定运算流程,计算机便可以不厌其烦地重复执行下去。原创 2016-09-17 17:48:53 · 2147 阅读 · 0 评论 -
一题多解(七)—— 同时进入 if / else 的方法
程序员圈子流传一句著名的段子:世界上最遥远的距离不是生与死,而是你在 if,而我在 else 里。是否就果真一次执行下来,二分支,二选一,if 与 else 非此即彼,只能进入一个?原创 2016-06-06 17:04:46 · 3080 阅读 · 0 评论 -
程序结构&&程序设计(三) ——递归及递归举例
递归,需要注意的是:首先言明递归退出的条件只需构造中间的某一步,或者某一个节点的处理逻辑,比如树(节点,节点左子树,节点右子树),剩下的交给递归程序的执行原创 2016-02-18 09:19:47 · 1142 阅读 · 0 评论 -
【程序的流程】—— 顺序 / 分支 / 循环
(1)if:实现对空间的划分(partition);(2)if 与随机数相结合表达概率;分段函数与 if else例1:对[0, 1]区间均匀分布 cdf 函数的模拟def uniform_cdf(x): if x < 0: return 0 # x < 0 elif x < 1: return x #原创 2016-04-12 13:12:24 · 2577 阅读 · 0 评论 -
位运算应用及其注意事项
1. 可能发生的溢出使用 64 位整数时发生的溢出。试编写代码,使其能够确认无符号的 64 位整数的位掩码(bitmask)a 的第 b 位(从右向左数)是否已经打开原创 2016-10-16 12:16:59 · 886 阅读 · 0 评论 -
递归缩写
GNU:GNU’s Not UnixLinux:Linux Is Not UniXEMACS:EMACS Makes A Computer Slow PNG:PNG’s Not GIFRPM:RPM Package Manager原创 2016-10-22 11:44:08 · 1841 阅读 · 0 评论 -
开源软件的许可(License)
自由软件基金会(Free Software Foundation):FSF0. GNUGNU (GNU is Not Unix 的递归缩写)计划,又称革奴计划,是由 Richard Stallman 在 1983 年 9 月 27 日公开发起的。它的目标是创建一套完全自由的操作系统。原创 2016-10-22 11:34:21 · 3288 阅读 · 0 评论 -
函数多个“返回值”
1. 通过参数确切地说,通过参数列表中,引用类型的参数,本质上返回值仍只有一个,且为基本数据类型;原创 2016-09-19 18:54:23 · 1125 阅读 · 0 评论 -
声明与定义
从编译原理上来说,声明是仅仅告诉编译器,有个某类型的变量会被使用,但是编译器并不会为它分配任何内存。而定义就是分配了内存(存在客观上的实物)。原创 2016-09-24 19:50:15 · 915 阅读 · 0 评论 -
循环体(for/while)循环变量的设置
1. 求滑动(移动)平均(moving average)原创 2016-09-04 09:22:44 · 1796 阅读 · 0 评论 -
函数的引用透明性(referential transparency)
1. 基础初学程序设计时,比较容易混淆的两个概念是数学函数(math function)和程序中使用的函数。在数学函数中 y=f(x)y=f(x),一个输入值有固定的输出值。例如,无论计算多少次,sinπ\sin\pi 的结果总是 0。如果 f(x)=x/2f(x)=x/2,那么 f(10)f(10) 无论计算 100 次还是 1000 次,其结果都是 5. 程序设计中的函数却不具备这种稳定的特性,原创 2016-09-08 16:43:36 · 7539 阅读 · 2 评论 -
while 常见程序逻辑
1. 查找List L;Position P = L;while (P && P->Element != Key) { P = P->Next;}return P;原创 2016-09-21 10:25:17 · 931 阅读 · 0 评论 -
for循环 与 while循环
通过本文,我们是否可以得出 while 循环比 for 循环更自由的结论?也即 for 循环能做的事,while循环都可做,但while 循环能做的事,for循环未必能做。 Python 语言对 for循环的支持其实是不如 C 语言的,Python 中的 for 循环,更多的是遍历,而无判断的意味,而 while 循环天然的是判断;while循环天然的具有判断逻辑,for循环需在循环内部添加判断原创 2016-02-17 15:43:06 · 1768 阅读 · 0 评论 -
while 循环的理解
两种情况(A、B)都会让循环体执行:while A or B:两种情况(A、B)都会退出循环体:while !A and !B:原创 2016-09-02 12:15:00 · 2020 阅读 · 0 评论 -
x=min(x, y)
x = min(x, y); ⇒ 当然 y 会有多个值传递进来 minHeight = min(minHeight, h[i]);置于循环之中,不断将当前得到的最小高度值和新加入进来的值进行比较;并在新值小于其值时,对其进行更新;不断将序列中的新值和自己进行对比,并更新;最终新得到的值不会比原来的值更大,值只会越来越小;原创 2016-09-07 16:45:56 · 1265 阅读 · 0 评论 -
代码段的理解
二层循环num = 1; for i = 1:m, for j = 1:n, num = num+1; endend最终 num = 1+m*n,如果 num 从 0 开始计数的话,num = m*n原创 2016-05-08 15:15:17 · 1130 阅读 · 0 评论 -
编程常见处理逻辑
1. 含有父指针的二叉树结点含有父指针的二叉树结点,一般会定义这样的一个宏(获取从父节点指向自己的指针):原创 2016-09-18 12:03:36 · 1002 阅读 · 0 评论 -
C/C++ 变量的初始化
1. 二维数组2. 结构体初始化原创 2016-09-21 08:19:13 · 1022 阅读 · 0 评论 -
堆空间与栈空间
栈向下扩展,向低地址方向拓展;堆向上拓展,向高地址方向拓展; 栈内存储元素过多,栈内存与堆内存发生交叉,就会产生段错误(Segment Fault),比如在无穷递归时,会不断创建栈上的局部对象,而不释放;int f(int n){ printf("n %d[%u]\n", n, &n); return f(n+1);}原创 2016-09-04 08:25:11 · 1493 阅读 · 0 评论 -
编程军规 —— Java 篇
1. matlab善用结构体作为函数的参数,以更多地对 matlab 这种编程语言,引入面向对象的编程思想。原创 2016-12-18 13:08:45 · 1232 阅读 · 0 评论 -
编程模式(schema) —— 表驱动法(table-driven)
使用表驱动法,而非繁琐冗长的 if/else, switch case(本身也代表一种代码坏味道),也是替身编程质量的重要手段,表驱动法是一种编程模式(schema)—— 从表里面查找信息而不使用逻辑语句(if/else, switch/case)。事实上,凡是能通过逻辑语句来选择(路由,分发)的事物,都可以通过查表来选择。if (语句A) { 语句B;}else { 语句原创 2017-10-10 23:38:31 · 1882 阅读 · 0 评论 -
接口的理解
编程世界的接口,对应于函数(不论是类中的成员函数,还是普通的外部函数);现实世界的接口,则对应于插板上的接口;不管是现实世界还是编程领域,接口都意味着一种规范,只有与接口相适配,才能调用和使用接口; 我是三孔的插板(函数的形参),你必须是三孔的插头(调用端);当然也要求输出也是一致的;原创 2016-09-08 20:31:21 · 822 阅读 · 0 评论 -
数值溢出(arithmetic overflow)问题与解决方案
1. 求最小公倍数根据最大公约数求最小公倍数;lcm(a,b)=a⋅bgcd(a,b) \text{lcm}(a,b)=\frac{a\cdot b}{\text{gcd}(a,b)} int gcd(int a, int b);int lcm(int a, int b){ return (a * b)/gcd(a, b);}数学意义上确实没有异议,但在编程实现时,考虑到计算机表示原创 2016-09-03 22:33:00 · 10937 阅读 · 0 评论 -
编程思想 —— 哨兵的使用
1. LDA:Leading Dimension of AView topic - leading dimension? Clarification of the leading dimension in CUBLAS when transposing 完整的说法是:leading dimension of two-dimensional array(用来存放数学意义上的矩阵的二维数组) us原创 2016-11-02 21:01:21 · 10334 阅读 · 1 评论 -
assert 的理解
assert 可以实现如下功能:保证参数之间的大小等约束关系;函数执行过程中得到的中间结果是否符合预期;def gen_batch(batch_size, skip_window, num_skips): assert batch_size % num_skips == 0 assert num_skips <= 2 * skip_window原创 2017-06-03 19:00:49 · 1369 阅读 · 0 评论 -
编程规范 —— 变量的命名
变量命名的最高原则:物理意义。1. 初始值(“任意”“随机”指定)的命名原创 2016-02-15 20:29:11 · 1737 阅读 · 0 评论 -
迭代即为递归
形如:for 1 -> n: x = f(x)都可由迭代形式转化为递归版本;1. 猴子分桃【智力题】—— 猴子分桃 桃的总数量可知为:55−4=31215^5-4=3121,求分五次后,桃子的剩余:1.1 丑陋版f = lambda x: x - x//5 - 1原创 2016-06-18 17:07:13 · 1114 阅读 · 0 评论 -
结构化编程 —— 顺序、分支(选择)、循环
sequence、conditional(selection)、selection1. 为什么只有这三种结构计算机中所有的存储都有 01 两种状态,因此整个计算机的数据就有 2^n 种状态,这些状态可以分别视为平面图上的点,而程序就是操作这些点进行状态转移的有向图(有限自动状态机),原创 2017-03-16 23:12:28 · 5596 阅读 · 0 评论 -
编程常见错误
2^38 ≠ 2 << 38>>> 2**38274877906944>>> 2<<385497558138882<<38表示的是 2×2382\times 2^{38}原创 2016-01-29 21:41:11 · 1000 阅读 · 0 评论 -
编程的心法与注意事项
1. 将尽可能多的操作放在函数体内,主调函数尽可能简单一些对成员变量有所更易的函数,尽可能地返回该变量以前的旧值;def add_vertex(self): self._mat.append([]) self._vnum += 1 return self._vnum - 1上述代码,为图的邻接表实现时的增加新的结点进去;原创 2016-09-01 15:17:39 · 977 阅读 · 0 评论 -
visual studio 编译器在辨异 C/C++ 程序时的注意事项
1. 数组大小的限制visual studio 对数组的维数(元素的个数)没有限制,但要求数组的 size (sizeof() 后的结果,所占内存的大小)不得超过 0x7fff ffff = 2^31-1;原创 2016-10-20 18:15:20 · 1179 阅读 · 0 评论 -
递归与尾递归
递归:recursion,尾递归:tail recursion尾递归和一般的递归不同在对内存的占用,普通递归创建 stack 累积而后计算收缩,尾递归只会占用恒量的内存(和迭代一样)。SICP 中描述了一个内存占用曲线,以 Python 代码为例(普通递归),求解前 N 个自然数的和原创 2016-09-18 15:29:10 · 934 阅读 · 0 评论 -
编程规范
对函数返回值进行判断返回值往往以为着一种状态 status,比如返回 bool 值,成功或者失败,对返回值进行提高是程序健壮性的重要手段。std::find()auto pos = std::find(vec.begin(), vec.end(), val);if (pos == vec.end()) ...else ...str.find()auto pos = str.f原创 2016-04-16 14:57:29 · 1002 阅读 · 0 评论 -
程序结构&&程序设计(四)
break / continuewhile 循环退出的条件与布尔表达式的骤死式语义原创 2016-03-04 20:32:41 · 1090 阅读 · 0 评论 -
编程常见错误——循环中进行有符号数和无符号数的比较
不要轻视甚至无视,编译器所报的警告,警告不是错误,但比错误更加凶险。也即,我们要追求没有警告的程序。本文,将以编译器经常会报的一个异常:warning C4018: “>=”: 有符号/无符号不匹配 为例说明忽视警告常会伴随一些古怪的结果发生原创 2016-02-25 17:42:40 · 2139 阅读 · 0 评论 -
for 循环的流程图等价形式
其实代码形式并未给出执行的流程顺序,反倒是其等价的流程图形式,简洁清晰:由图可知:由菱形表示的表达式2,是一种逻辑判断(二分之)表达式1,仅执行一次;循环体的执行,必须在表达式2为真的前提下才可进行;一旦不满足表达式2,循环立即退出;原创 2016-02-25 18:42:16 · 16532 阅读 · 0 评论 -
程序结构&&程序设计(三)
1. 接口的设计1. 判断2. 私有成员函数 ==》让公有成员函数的生活更美好3. 创建变量的备份4. 判断一个成员函数有没有被调用(让一个函数只执行一次)原创 2016-02-21 12:26:19 · 1226 阅读 · 0 评论 -
程序结构&&程序设计(二)
程序结构&&程序设计 1. 函数的功能函数无非至少完成以上二事中的一件:获得返回值,对传递进来的参数(非值传递)进行修改否则要那么一段程序干嘛呢;2. 循环,直到获得符合条件的输入为止3. flag 变量及其位置4. 从控制台获得列表的方法(循环)5. 断言函数(predicate)原创 2016-02-15 20:40:28 · 1002 阅读 · 0 评论 -
程序结构&&程序设计
实现一种自更新a=σ(w⋅a+b)a=\sigma(w\cdot a+b)这里ww是二维矩阵,而aa和bb是向量,σ(⋅)\sigma(\cdot)处理一个向量,得到的向量aa,又反过来作为程序的输入,可通过几乎所有程序设计语言的赋值运算进行实现:for w, b in zip(weights, biases): a = sigma(np.dot(w, a)+b)原创 2015-11-24 21:59:59 · 1167 阅读 · 0 评论