返回信息流没看过第一季的看这里:http://bbs.byr.cn/article/Joke/696463
手机用户看这里:http://m.byr.cn/article/Joke/696463
========
一个妹纸最近黄瓜消耗得太快。她的闺蜜向她推荐了一款按摩棒,说用它按摩特别舒服。那天晚上,闺蜜不小心偷看到她在拿着按摩棒手动地运动。于是急不可耐地告诉她,你造吗,给它装一个电池,打开开关,它会自己震动。妹纸说,酱紫啊,我习惯了……
========
从前有一个BASIC程序员,他写的程序看上去是这样子的。
5 REM Rocket launching simulator
10 PRINT "Input a number:"
20 INPUT n%
30 PRINT "Counting down..."
40 i% = n%
50 PRINT i%
60 i% = i% - 1
70 IF i% > 0 THEN GOTO 50
80 PRINT "Launch!"
90 END
当他的朋友嘲笑他,说BASIC的风格很烂他就开始学C语言了。然后,第二天,他的朋友看到他的代码如下:
/* Rocket launching simulator */
main() {
int i, n;
printf("Input a number:");
scanf("%d", &n);
printf("Counting down...");
i = n;
nexti:
printf("%d\n", i);
i--;
if (i > 0) goto nexti;
printf("Launch!\n")
exit(0);
}
朋友好奇,问:你知道C语言有for循环吗?比goto好看多了,你明明可以这样写的:
for (i=n; i>=0; i--) {
printf("%d\n", i);
}
他回答:这……for循环太不直观了,还是goto好,习惯了。
===========
一个c程序员如此写冒泡排序程序:
void bubble_sort(int ar[], int sz) {
int rbound, cur;
for (rbound = sz-2; rbound >= 0; rbound--) {
for (cur = 0; cur < rbound; cur++) {
if (ar[cur] > ar[cur+1]) {
int tmp = ar[cur];
ar[cur] = ar[cur+1];
ar[cur+1] = tmp;
}
}
}
}
后来,他的朋友向他介绍了优雅的Python语言,他高兴得写了一个Python程序:
def bubble_sort(lst):
for rbound in range(len(lst)-2, -1, -1):
for cur in range(rbound):
if lst[cur] > lst[cur+1]:
tmp = lst[cur]
lst[cur] = lst[cur+1]
lst[cur+1] = tmp
他的朋友对他说:你知道Python有“多重赋值”吗?有人跟你展示过a,b=b,a这样的写法吗?你的程序可以这样写的:
...
lst[cur], lst[cur+1] = lst[cur+1], lst[cur]
...
他说:这……习惯了。
好孩子不要学哦。Python的list有sort方法的。是稳定的O(n*log(n))的算法。
====
有一个Haskell程序员,习惯于写没有副作用的函数式数据结构。比如,这是他写的斐波那契数列程序:
fibs = 0:1:zipWith (+) fibs (tail fibs)
-- Comment: fibs == [0,1,1,2,3,5,8,13,21,34,55,...]
后来他的同事让他用C++写一个。他这样写:
#include <iostream>
struct StreamNode {
virtual int eval()=0;
virtual StreamNode* next()=0;
};
struct InitNode : public StreamNode {
int num;
StreamNode* nxt;
InitNode(int _num):num(_num){}
int eval() { return num; }
StreamNode* next() { return nxt; }
};
struct ZipNode : public StreamNode {
bool evaluated;
int cacheVal;
bool nexted;
StreamNode *cacheNext;
StreamNode *br1, *br2;
ZipNode(StreamNode *_br1, StreamNode *_br2):br1(_br1),br2(_br2),evaluated(false),nexted(false) {}
int eval() {
if (!evaluated) {
evaluated = true;
cacheVal = br1->eval() + br2->eval();
}
return cacheVal;
}
StreamNode* next() {
if (!nexted) {
nexted = true;
cacheNext = new ZipNode(br1->next(), br2->next());
}
return cacheNext;
}
};
using namespace std;
int main() {
InitNode *zeroNode = new InitNode(0);
InitNode *oneNode = new InitNode(1);
ZipNode *zipNode = new ZipNode(zeroNode, oneNode);
zeroNode->nxt = oneNode;
oneNode->nxt = zipNode;
StreamNode *fibs = zeroNode;
int i;
StreamNode *curNode = fibs;
for(i=0; i<10; i++) {
int v = curNode->eval();
cout<<v<<endl;
curNode = curNode->next();
}
return 0;
}
/*
输出:
0
1
1
2
3
5
8
13
21
34
*/
朋友说:Haskell的惰性求值果然好用。(啊?你竟然看懂了?)可是,内存泄漏了啊,C++没有垃圾回收的。(好像吐槽的地方不对吧……
Haskell程序员说:习惯了……你还是用boehm gc凑合一下吧。(其实,生成的fibs就是一个单链表,从前往后按顺序删除一下就可以了)
(待续)
这是一条镜像帖。来源:北邮人论坛 / joke / #696528同步于 2015/1/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Joke机器人发帖
[码农向]从前有一个伐木工……第二季,直播
nuanyangyang
2015/1/30镜像同步18 回复
订阅后,新回复会通过你的通知中心匿名送达。