汉诺塔真是学递归的经典例子啊~这里再来一个 Ruby 版本的。
1 | @step_nbr = 0 |
汉诺塔真是学递归的经典例子啊~这里再来一个 Ruby 版本的。
1 | @step_nbr = 0 |
本来以为可以终于开开心心地升级到 ASP.NET MVC 5.1了,谁知升级完毕之后在编辑 view 页面的时候,编辑器布满了红色波浪线,因为它无法识别各种HtmlHelper的方法了。按照说明,Visual Studio 2013 Update 1也是安装了的。经过各种尝试,耗费了无数时间,用Google把网络翻了一个底朝天,基本上断定是因为web.config配置的问题,可是不管怎么调整,都不好用。眼看就要对我的人生和理想失去信心时,突然灵机一动,也许是我改错了web.config文件,不是项目根目录的那个,而是views目录下的那个?!打开views目录下的web.config文件一看,果然如此!System.Web.WebPages.Razor引用的是2.0.0.0,System.Web.Mvc引用的是4.0.0.0。将System.Web.WebPages.Razor引用改为3.0.0.0,System.Web.Mvc引用改为5.1.0.0,保存,再重启VS 2013(也许是非必要),问题解决了~~
此一役暴露出两点问题。
汉诺塔,数据结构和算法里老生常谈的东西了,可惜我至今没有彻底透彻的搞清楚它的递归细节。现在利用学习 Go 语言的机会,再重新理清一下它的实现和递归的本质。
先上代码:
1 | package main |
我现在理解的递归的本质就是用把 n 级的问题用 n-1 级定义出来,找出所谓的递归结构,进而找出递推公式。对于汉诺塔问题,就是要抽象出以下4个变量:n, x, y, z。n 代表问题规模,即 n 层盘子,x, y, z 分别表示源柱,目标柱和过渡柱。函数内部就是聚焦于这4个变量的操作:
这样通过递归,n 的规模不断减小,直到 n == 0,同类问题的最小规模情况,对于这个最小规模情况,我们知道确切的答案,就是不做任何操作(直接 return),进而触发了递归的反向求值连锁反应。所以,递归其实就是这样一个过程:
前面每层的答案都等待着下一层的答案再加上一个已知计算,一直到第1层或者第0层有一个已知答案,进而第2层因为第1层有了答案而有了答案,第3层因为第2层有了答案而有了答案……一直到第 n 层因为第 n-1 层有了答案而有了答案,于是整个问题有了解。
从一开始我就打算用 Markdown 来撰写我的随笔,然后利用工具转换为 Html 格式显示到博客上。这么做的原因是,可以用我比较喜欢的文本编辑器来写作,同时不用花费过多精力在格式细节上。至于用什么解析器来转换呢?我很希望可以用 GitHub 的解析器,因为它针对编程相关的文档有一些特别的优化,最简单的例子是,在某些编程语言中,经常使用带有多个下划线的变量名,比如 this_is_a_variable,如果用标准的解析器,这连续的下划线就会被作为格式代码解析而得不到理想的结果。另外 GitHub 的解析器也支持利用三个『`』方式标识代码,比4个空格的方式方便多了。
共产主义社会必然会先在互联网上实现。
我浏览 GitHub 上它自己的 repositories,发现了它的一个项目markup, “We use this library on GitHub when rendering your README or any other rich text file.”,就是它了。
这个项目本身是 Ruby 项目,好在我多少也研究过一点 Ruby。git clone 下来,在 bin 目录里有个可以直接运行的脚本 “github-markup” 后面带个需要转换的文件名就行了,相当简单。根据 README,这个项目根据需要转换的原始格式,依赖于其它几个 Ruby 库,比如要解析 markdown,就需要redcarpet,没问题,运行”gem install redcarpet”安装之。写个 markdown 文档测试一下,发现结果并不是我想要的,那些特有的特性并没有实现,这是怎么回事?
(开源,开源,我爱你)
那就看看代码呗,在markdown.rb 代码文件里有这么一段:
1 | MARKDOWN_GEMS = { |
由此看来,它其实支持很多 markdown 解析库,README 里只提到了redcarpet,而看起来我们真正需要的是第一个:”github/markdown”,那么哪里才能找到呢?Here it is! 现在,只需要运行 “gem install github-markdown”,然后再运行那个 “github-markup filename”,就可以得到期望的结果了。
其实 GitHub 提供的 API 就支持 markdown 转换:http://developer.github.com/v3/markdown/
如果直接利用 API 更容易些,那就用呗~~
自己注册的域名,自己构建的网站和博客系统,自己设想的随笔发布流程和方式(虽然现在看来有些麻烦),在互联网上划定一片自己说得算的小天地,这感觉不错。如今很快就要21岁了 —— 好吧,是16进制的21 —— 想做的事情比当年多得多,但是时间比当年少得少,不管怎样,随心所欲,能做多少做到,能做到什么程度就算什么程度,我最不喜欢的就是强迫别人或我自己,当然也不喜欢别人强迫我自己。希望这个网站和博客可以促使我多多学习、多多总结、多多实验一些有趣的想法。
对于阅读到此且好奇16进制21等于10进制多少但此时此刻还没有心算、笔算、 Google、必应、百度、问别人的朋友,不劳您辛苦了, 0x21 == 33.