V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  bramblex  ›  全部回复第 22 页 / 共 54 页
回复总数  1061
1 ... 18  19  20  21  22  23  24  25  26  27 ... 54  
2016-06-08 18:22:48 +08:00
回复了 cashew 创建的主题 程序员 前有面试者生无可恋,今有接不到面试死无葬身
你才花了 1 年时间,但人家科班学生可花了 4 年时间学啊……

你拿什么比?
我花点时间完整讲一下吧。

如前面所说, fact (n, ret) 函数中的

// fact (n-1, function(t0) {
// ret(n*t0)
// })

就是在构建一个新的 continuation 的过程, 并把原来的再包进去。只要分步把这个函数的 continuation 一步一步展开,那就明白了。

举个🌰,展开 fact (3, ret) ,
首先 fact (3, ret) 展开成 fact (2, function(t0){ ret(3 * t0) })
知道作者为什么设一个 t0 吗?因为还有 t1, t2, t3 ,天生骄傲。(本人 t1 锤粉转黑)
然后 fact (2, ...) 展开成 fact (1, function(t1){ (function(t0){ret(3*t0})(2*t1) })
再然后 fact (1, ...) => fact(0, function(t2){ ( function(t1){ (function(t0){ret(3*t0})(2*t1) })(1*t2) })
最后 fact(0, ...) => (function(t2){(function(t1){ (function(t0){ret(3*t0})(2*t1) })(1*t2) })(1)

代入所有参数得到 ret(3*2*1*1) 就是结果(马德绕了那么一大圈)

其实段代码看似 “尾递归优化” ,但是其实跟尾递归优化一点关系都没有,而且前面所说的能优化函数栈也是扯蛋,这只是把 fact 函数调用时候的函数栈转嫁到了 continaution 上了罢了,一点都没有优化。不信我们把这个所谓 “尾递归优化” 的代码转成循环给你们看看结果。转换成循环的方式在我博客里面有 http://lovearia.me/article/show/9

// function fact(arg_n, arg_ret) {
// let n = arg_n;
// let ret = arg_ret;
//
// while (true){
// if (n == 0){
// ret(1);
// break;
// }
// else{
// let _n = n;
// let _ret = ret;
// n = _n - 1;
// ret = function(t0){_ret(_n*t0)}; // <= 会在这里爆栈,根本没有任何优化效果
// continue;
// }
// }
// }

至于前面有人提到 cps 执行的过程中可以优化函数栈,但是这时候为了递归优化而写成 cps 形式其实是很没有意义的,因为它实质就是尾递归优化,并且还需要很庞大的空间消耗来构建这个 continuation ,这和直接递归几乎没差别。这个 cps 递归只有在类似 haskell 这类惰性求值的语言中才能很好的优化,但是问题是在 haskell 这类惰性求值的语言中根本这种利用 cps 递归的写法本身又没有意义…
@chiu 在 J's 中基本上只在处理异步上意义比较大
@loading 我没说明白…首先,我假设楼主前面的都懂了…卡在 fact 上面了…

输入法的锅我不背
@azh7138m

哎 /w\ 这个是不能尾递归的。因为她的函数栈是没有办法优化掉的。我写了一篇专门讲尾递归的文章~

在这里~ http://lovearia.me/article/show/9
首先,我先这篇文章前面东西都懂了,到这个 fact 这里卡住了。

fact (n, ret) 这个函数,里面的 fact(n-1, function (t0) {ret(n * t0) }) 这段代码的作用是递归构建 continuation 而已。

楼上的一众基础真差,包括某所谓的 “阿里前端”
2016-06-07 11:30:12 +08:00
回复了 cwlmxwb 创建的主题 程序员 大家对程序设计的 23 种设计模式怎么看
@slert

因为码农主要干的活都是拿别人现成的框架填业务逻辑。

但是如果自己设计框架就不一样了,放眼望去,全都是设计模式。
2016-06-07 11:27:17 +08:00
回复了 cwlmxwb 创建的主题 程序员 大家对程序设计的 23 种设计模式怎么看
@icybee

当然跟语言有关,只有 oop 语言才适用 oop 的设计模式。

换一门 functional 的语言, oop 的设计模式就都日狗了。

不过由于主流语言绝大部分是 oop 的,所以其实总体来说,设计模式的适用范围还是挺广的。
2016-06-06 16:27:32 +08:00
回复了 Pandara 创建的主题 程序员 大家平时闲暇时会做些什么呢?
写代码,造轮子玩……
2016-06-05 23:36:18 +08:00
回复了 hard2reg 创建的主题 Python 发现 Python 的一个坑。。。
@hard2reg

输出 0.6 太正常不过了

a = 0.2 + 0.4 这行代码已经被 C++ 编译器编译优化成了 a = 0.6 了。所以在程序运行的时候根本就不存在 0.2 + 0.4 这个步骤,所以也就没有什么丢失精度的问题了。
2016-06-05 23:30:15 +08:00
回复了 hard2reg 创建的主题 Python 发现 Python 的一个坑。。。
@justjavac

输出 0.6 很正常, C++ 编译器的优化会把一些没什么意义的数值提前算出来,根本就轮不到运算……
2016-06-02 07:26:17 +08:00
回复了 ifane 创建的主题 程序员 取得字符串指定数据有什么高效率的方法
用字符串分割简直不能再高效了……
2016-06-01 17:44:49 +08:00
回复了 whatisnew 创建的主题 PHP 有人认真看过 slim 的代码质量吗?
烂得在能够接受的程度内就懒得造轮子
2016-05-26 10:26:42 +08:00
回复了 bramblex 创建的主题 JavaScript [今天生日]造了个编译到 JavaScript 的语言取名叫做 Smooth
@cholerae 显示优越感,光一个简单的 Monad 就能把绝大多数码农挡灾墙外
2016-05-26 08:58:20 +08:00
回复了 bramblex 创建的主题 JavaScript [今天生日]造了个编译到 JavaScript 的语言取名叫做 Smooth
@guyskk

/w\ 其实说实话,我就是因为不想写 JavaScript ,并且觉得 Coffee 不够好, PureScript 不够方便我才自己造的~

啦啦啦~
2016-05-26 08:51:42 +08:00
回复了 bramblex 创建的主题 JavaScript [今天生日]造了个编译到 JavaScript 的语言取名叫做 Smooth
@guyskk

当然差很多……
说句不好听的 pthon3.5 / es6 的 await 全是垃圾,把原本非常简单的问题搞得那么复杂。 c # 不会,所以不喷
1 ... 18  19  20  21  22  23  24  25  26  27 ... 54  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1001 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 40ms · UTC 19:41 · PVG 03:41 · LAX 12:41 · JFK 15:41
Developed with CodeLauncher
♥ Do have faith in what you're doing.