2014年2月5日 星期三

費氏數列(Fibonacci)

Fibonacci on wiki

使用遞回

/*
 * @parama n 第n項(n為正整數)
 * @return 第n項的值
 */
function fibonacci(n)
    if n <= 1
        return n
    return fibonacci(n-1) + fibonacci(n-1)
end

使用迭代

/*
 * @parama n 第n項(n為正整數)
 * @return 第n項的值
 */
function fibonacci(n)
    if n <= 1
        return n
    int a=0, b=1,t;
    for i = 2 to n do
        t = a+b
        a = b
        b = t
    end
    return b
end

使用cache優化遞回

/*
 * @parama n 第n項(n為正整數)
 * @return 第n項的值
 */
function fibonacci(n)
    static Array cache ||= {0,1}
    if cache[n] not null
        return cache[n]
    cache[n] = fibonacci(n-1) + fibonacci(n-1)
    return cache[n]
end

我在Github上使用Ruby的實作

Fork me on github

Markdown to HTML(Maruku)

Maruku on Github

本文網址

純Ruby做成,可將Markdown語法轉換成HTML,latex,md...等格式,以下簡單做點介紹。

安裝

gem install maruku

先在irb下面做點測試

require 'Maruku'            # => true

# 設定Markdown字串
markdown_string = '#大標題'

# 使用Markdown字串 建立Maruku物件
doc = Maruku.new(markdown_string)

#從Maruku物件輸出HTML文檔
doc.to_html                 # => "\n<h1 id=\"\">大標題</h1>\n" 

#從Maruku物件輸出latext文檔
doc.to_latext_document      # => "\\documentclass{article}\n\n% ... 

至於還有哪些Methods 自己用Ruby內建的methods語法來顯示

Maruku.methods              # => 一堆class methods
Maruku.new.methods          # => 一堆instance methods

可以再加上正規表示式來尋找

Maruku.new.methods.grep(/html/)  # => 一堆HTML相關的instance methods
Maruku.new.methods.grep(/latex/) # => 一堆latex相關的instance methods

與Ruby on Rails結合

在Gemfile裡面加上

gem 'maruku'

譬如你自己做個Blog,讓人使用Markdown語法來寫文章。文件從資料庫取出來,直接傳給view顯示就行了,例如文章儲存在Post資料表的content欄位

Markdown_string = Post.first.content
@doc = Maruku.new(Markdown_string)

在view的部分找個地方直接

<span>@doc.to_html.html_safe</span>

記得要使用html_safe,不然只會出現一堆&lt ; &gt ; 的符號,當然你自己得確定從Markdown轉出來的HTML是安全的(至少我目前還沒發現,要怎麼在Markdown裡面塞javascript,所以都當它們都是安全的)

Code Block for Blogger

Code Block for Blogger

我使用Markdonw語法打部落格文章,先轉換成Html之後,在貼到Blogger去,但是闡述程式碼的Code Block的區塊,產生出來的HTML是

<pre><code> ... </pre></code> 

這些HTML貼到Blooger去,因為沒有CSS樣式裝飾,所以只有簡單的換行縮排,看起來有點像引言

這邊我們可以自己加上CSS Style上去,讓他看起來漂亮點。首先Markdown轉出來的code block有兩種形式,一種是嵌入式的,譬如-> int i=0; <- 直接嵌入在行內,另一種是整個程式碼區塊,譬如:

int i=0;    /* 程式碼自己佔一個區塊 */

嵌入式的程式碼區塊產生的HTML會是`int i=0;

整個程式碼區塊產生的HTML會是`

int i=0;

差在<pre>tag的有無,所以我們只要分別加上這兩個CSS Style給blooger的範本,就行了。可以自己寫,不過我直接在網路上找別人做好的:

<style>
code {
background-color: #F9F9F9;
border: 1px dashed #2F6FAB;
color: black;
/* line-height: 1.1em; 
padding: 1em;*/
}

pre code {
display: block; /* fixes a strange ie margin bug */
font-family: Courier New;
font-size: 10pt;
overflow:auto;
background: #f0f0f0 url(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAASwCAYAAAAt7rCDAAAABHNCSVQICAgIfAhkiAAAAQJJREFUeJzt0kEKhDAMBdA4zFmbM+W0upqFOhXrDILwsimFR5pfMrXW5jhZr7PwRlxVX8//jNHrGhExjXzdu9c5IiIz+7iqVmB7Hwp4OMa2nhhwN/PRGEMBh3Zjt6KfpzPztxW9MSAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzAMwzB8HS+J9kUTvzEDMwAAAABJRU5ErkJggg==) left top repeat-y;
border: 1px solid #ccc;
padding: 10px 10px 10px 21px;
max-height:1000px;
line-height: 1.2em;
}
</style>

把上面一串貼到你的Blogger範本去,進入編輯HTML,放在<head>裡面就行了。


這個CSS將兩個HTML tag <code><pre><code> 加上了一些裝飾。

如果在網路上找相關的CSS style樣式表,大部份別人的CSS style樣式表是內容大約是這樣

.post .codeblock { ... }

事實上這樣比較正確,在指定的程式碼區塊Tag加上class=codeblock,才會套用此CSS樣式。此法可以將Markdown產生的程式碼區塊,與非Markdown產生的<code></code>鬆綁。

但我懶得Markdown轉換後還要一個一個加上class name,而且我貼到Blogger去的文章一定都是我用Markdown打的,所以就直接CSS指定<code><pre><code>區塊都套用CSS。