理解得越多,需要记忆的越少

2014-05-08
Ruby版本的汉诺塔实现

汉诺塔真是学递归的经典例子啊~这里再来一个 Ruby 版本的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@step_nbr = 0

def hanoi(height, from_pole, to_pole, with_pole)
if height >= 1
hanoi(height - 1, from_pole, with_pole, to_pole)
@step_nbr += 1
puts "#{@step_nbr}: move disk from #{from_pole} to #{to_pole}"
hanoi(height - 1, with_pole, from_pole, to_pole)
end
end

puts 'Please enter the height of the tower:'
height = gets
hanoi(height.to_i, 'a', 'b', 'c')
阅读此文

2014-04-21
ASP.NET MVC 4项目升级到5.1后VS 2013的Razor编辑器功能不正常

本来以为可以终于开开心心地升级到 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(也许是非必要),问题解决了~~

此一役暴露出两点问题。

  • 既然只是视图问题,并且料定是配置文件问题,我应该早点想到是views目录下的那个web.config具有最终效力。
  • 微软的升级过程还是有大大的瑕疵啊~
阅读此文

2014-04-21
汉诺塔的 Go 语言实现

汉诺塔,数据结构和算法里老生常谈的东西了,可惜我至今没有彻底透彻的搞清楚它的递归细节。现在利用学习 Go 语言的机会,再重新理清一下它的实现和递归的本质。

先上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package main

import (
"fmt"
"os"
"strconv"
)

var step int

func main () {
var n int
var err error

if (len(os.Args) == 1) {
n = 3
} else {
n, err = strconv.Atoi(os.Args[1])
if (err != nil) {
fmt.Fprintf(os.Stderr, "failed to get n.\n%s\n", err.Error())
return
}
}
step = 0
hanoi(n, "A", "B", "C")
}

func hanoi (n int, x string, y string, z string) {
if (n == 0) {
return
}

hanoi(n - 1, x, z, y)
step++
fmt.Printf("%d: %s -> %s\n", step, x, y)
hanoi(n - 1, z, y, x)
}

我现在理解的递归的本质就是用把 n 级的问题用 n-1 级定义出来,找出所谓的递归结构,进而找出递推公式。对于汉诺塔问题,就是要抽象出以下4个变量:n, x, y, z。n 代表问题规模,即 n 层盘子,x, y, z 分别表示源柱,目标柱和过渡柱。函数内部就是聚焦于这4个变量的操作:

  1. 把 n-1 个盘子从源柱经过目标柱的过渡,挪到过渡柱(从而使源柱上只有第 n 个盘子)
  2. 把第 n 个盘子从源柱上挪到目标柱上(程序输出这个单步的操作)
  3. 把过渡柱上的 n-1 个盘子经过源柱挪到目标柱上

这样通过递归,n 的规模不断减小,直到 n == 0,同类问题的最小规模情况,对于这个最小规模情况,我们知道确切的答案,就是不做任何操作(直接 return),进而触发了递归的反向求值连锁反应。所以,递归其实就是这样一个过程:

  • 第 n 层答案 = 第 n-1 层答案 + 固定已知计算
  • 第 n-1 层答案 = 第 n-2 层答案 + 固定已知计算
  • ……
  • 第 0或1 层答案 = 一个确定已知答案

前面每层的答案都等待着下一层的答案再加上一个已知计算,一直到第1层或者第0层有一个已知答案,进而第2层因为第1层有了答案而有了答案,第3层因为第2层有了答案而有了答案……一直到第 n 层因为第 n-1 层有了答案而有了答案,于是整个问题有了解。

阅读此文

2014-04-21
用 GitHub 的 Markdown 解析器转换文本

从一开始我就打算用 Markdown 来撰写我的随笔,然后利用工具转换为 Html 格式显示到博客上。这么做的原因是,可以用我比较喜欢的文本编辑器来写作,同时不用花费过多精力在格式细节上。至于用什么解析器来转换呢?我很希望可以用 GitHub 的解析器,因为它针对编程相关的文档有一些特别的优化,最简单的例子是,在某些编程语言中,经常使用带有多个下划线的变量名,比如 this_is_a_variable,如果用标准的解析器,这连续的下划线就会被作为格式代码解析而得不到理想的结果。另外 GitHub 的解析器也支持利用三个『`』方式标识代码,比4个空格的方式方便多了。

可以利用 GitHub 的 Markdown 解析器吗?怎么用?

共产主义社会必然会先在互联网上实现。

我浏览 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
MARKDOWN_GEMS = {
"github/markdown" => proc { |content|
GitHub::Markdown.render(content)
},
"redcarpet" => proc { |content|
RedcarpetCompat.new(content).to_html
},
"rdiscount" => proc { |content|
RDiscount.new(content).to_html
},
"maruku" => proc { |content|
Maruku.new(content).to_html
},
"kramdown" => proc { |content|
Kramdown::Document.new(content).to_html
},
"bluecloth" => proc { |content|
BlueCloth.new(content).to_html
},
}

由此看来,它其实支持很多 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 更容易些,那就用呗~~

阅读此文

2014-04-21
自己动手,丰衣足食

自己注册的域名,自己构建的网站和博客系统,自己设想的随笔发布流程和方式(虽然现在看来有些麻烦),在互联网上划定一片自己说得算的小天地,这感觉不错。如今很快就要21岁了 —— 好吧,是16进制的21 —— 想做的事情比当年多得多,但是时间比当年少得少,不管怎样,随心所欲,能做多少做到,能做到什么程度就算什么程度,我最不喜欢的就是强迫别人或我自己,当然也不喜欢别人强迫我自己。希望这个网站和博客可以促使我多多学习、多多总结、多多实验一些有趣的想法。

对于阅读到此且好奇16进制21等于10进制多少但此时此刻还没有心算、笔算、 Google、必应、百度、问别人的朋友,不劳您辛苦了, 0x21 == 33.

阅读此文