Skip to content

Commit 96a8670

Browse files
committed
Site updated: 2017-05-11 23:34:45
1 parent 6c94279 commit 96a8670

File tree

3 files changed

+9
-69
lines changed

3 files changed

+9
-69
lines changed

2016/05/14/什么是函数式编程思维/index.html

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -82,16 +82,7 @@ <h1>什么是函数式编程思维?</h1>
8282
<p>这是什么意思呢?</p>
8383
<p>假如,现在你来到 google 面试,面试官让你把二叉树镜像反转一下(大雾</p>
8484
<p>几乎不假思索的,就可以写出这样的 Python 代码:</p>
85-
<pre><code class="python"><span class="function"><span class="keyword">def</span> <span class="title">invertTree</span><span class="params">(root)</span>:</span>
86-
<span class="keyword">if</span> root <span class="keyword">is</span> <span class="keyword">None</span>:
87-
<span class="keyword">return</span> <span class="keyword">None</span>
88-
<span class="keyword">if</span> root.left:
89-
invertTree(root.left)
90-
<span class="keyword">if</span> root.right:
91-
invertTree(root.right)
92-
root.left, root.right = root.right, root.left
93-
<span class="keyword">return</span> root
94-
</code></pre>
85+
<figure class="highlight python"><table><tr><td class="code"><pre><div class="line"></div><div class="line"><span class="function"><span class="keyword">def</span> <span class="title">invertTree</span><span class="params">(root)</span>:</span></div><div class="line"></div><div class="line"> <span class="keyword">if</span> root <span class="keyword">is</span> <span class="keyword">None</span>:</div><div class="line"></div><div class="line"> <span class="keyword">return</span> <span class="keyword">None</span></div><div class="line"></div><div class="line"> <span class="keyword">if</span> root.left:</div><div class="line"></div><div class="line"> invertTree(root.left)</div><div class="line"></div><div class="line"> <span class="keyword">if</span> root.right:</div><div class="line"></div><div class="line"> invertTree(root.right)</div><div class="line"></div><div class="line"> root.left, root.right = root.right, root.left</div><div class="line"></div><div class="line"> <span class="keyword">return</span> root</div></pre></td></tr></table></figure>
9586
<p>好了,现在停下来看看这段代码究竟代表着什么——</p>
9687
<p>它的含义是:首先判断节点是否为空;然后翻转左树;然后翻转右树;最后左右互换。</p>
9788
<p>这就是命令式编程——你要做什么事情,你得把达到目的的步骤详细的描述出来,然后交给机器去运行。</p>
@@ -101,20 +92,9 @@ <h1>什么是函数式编程思维?</h1>
10192
<p>所谓“翻转二叉树”,可以看做是要得到一颗和原来二叉树对称的新二叉树。</p>
10293
<p>这颗新二叉树的特点是每一个节点都递归地和原树相反。</p>
10394
<p>用 haskell 代码表达出来就是:</p>
104-
<pre><code class="haskell"><span class="class"><span class="keyword">data</span> <span class="type">Tree</span> a = <span class="type">Node</span> a (<span class="type">Maybe</span> (<span class="type">Tree</span> <span class="title">a</span>)) (<span class="type">Maybe</span> (<span class="type">Tree</span> <span class="title">a</span>))</span>
105-
<span class="keyword">deriving</span> (<span class="type">Show</span>, <span class="type">Eq</span>)
106-
107-
<span class="title">invert</span> :: <span class="type">Maybe</span> (<span class="type">Tree</span> a) -&gt; <span class="type">Maybe</span> (<span class="type">Tree</span> a)
108-
<span class="title">invert</span> <span class="type">Nothing</span> = <span class="type">Nothing</span>
109-
<span class="title">invert</span> (<span class="type">Just</span> <span class="type">Node</span> v l r) = <span class="type">Just</span> (<span class="type">Node</span> v (invert r) (invert l))
110-
</code></pre>
95+
<figure class="highlight haskell"><table><tr><td class="code"><pre><div class="line"><span class="class"><span class="keyword">data</span> <span class="type">Tree</span> a = <span class="type">Nil</span> | <span class="type">Node</span> a (<span class="type">Tree</span> <span class="title">a</span>) (<span class="type">Tree</span> <span class="title">a</span>)</span></div><div class="line"> <span class="keyword">deriving</span> (<span class="type">Show</span>, <span class="type">Eq</span>)</div><div class="line"></div><div class="line"><span class="title">invert</span> :: <span class="type">Tree</span> a -&gt; <span class="type">Tree</span> a</div><div class="line"><span class="title">invert</span> <span class="type">Nil</span> = <span class="type">Nil</span></div><div class="line"><span class="title">invert</span> (<span class="type">Node</span> v l r) = <span class="type">Node</span> v (invert r) (invert l)</div></pre></td></tr></table></figure>
11196
<p>(防止看不懂,翻译成等价的 python )</p>
112-
<pre><code class="python"><span class="function"><span class="keyword">def</span> <span class="title">invert</span><span class="params">(node)</span>:</span>
113-
<span class="keyword">if</span> node <span class="keyword">is</span> <span class="keyword">None</span>:
114-
<span class="keyword">return</span> <span class="keyword">None</span>
115-
<span class="keyword">else</span>
116-
<span class="keyword">return</span> Tree(node.value, invert(node.right), invert(node.left))
117-
</code></pre>
97+
<figure class="highlight python"><table><tr><td class="code"><pre><div class="line"></div><div class="line"><span class="function"><span class="keyword">def</span> <span class="title">invert</span><span class="params">(node)</span>:</span></div><div class="line"></div><div class="line"> <span class="keyword">if</span> node <span class="keyword">is</span> <span class="keyword">None</span>:</div><div class="line"></div><div class="line"> <span class="keyword">return</span> <span class="keyword">None</span></div><div class="line"></div><div class="line"> <span class="keyword">else</span></div><div class="line"></div><div class="line"> <span class="keyword">return</span> Tree(node.value, invert(node.right), invert(node.left))</div></pre></td></tr></table></figure>
11898
<p>这段代码体现的思维,就是旧树到新树的映射——对一颗二叉树而言,它的镜像树就是左右节点递归镜像的树。</p>
11999
<p>这段代码最终达到的目的同样是翻转二叉树,但是它得到结果的方式和 python 代码有着本质的差别:通过描述一个 旧树-&gt;新树 的映射,而不是描述“从旧树得到新树应该怎样做”来达到目的。</p>
120100
<p>那么这样思考有什么好处呢?</p>

index.html

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -341,16 +341,7 @@ <h1>
341341
<p>这是什么意思呢?</p>
342342
<p>假如,现在你来到 google 面试,面试官让你把二叉树镜像反转一下(大雾</p>
343343
<p>几乎不假思索的,就可以写出这样的 Python 代码:</p>
344-
<pre><code class="python"><span class="function"><span class="keyword">def</span> <span class="title">invertTree</span><span class="params">(root)</span>:</span>
345-
<span class="keyword">if</span> root <span class="keyword">is</span> <span class="keyword">None</span>:
346-
<span class="keyword">return</span> <span class="keyword">None</span>
347-
<span class="keyword">if</span> root.left:
348-
invertTree(root.left)
349-
<span class="keyword">if</span> root.right:
350-
invertTree(root.right)
351-
root.left, root.right = root.right, root.left
352-
<span class="keyword">return</span> root
353-
</code></pre>
344+
<figure class="highlight python"><table><tr><td class="code"><pre><div class="line"></div><div class="line"><span class="function"><span class="keyword">def</span> <span class="title">invertTree</span><span class="params">(root)</span>:</span></div><div class="line"></div><div class="line"> <span class="keyword">if</span> root <span class="keyword">is</span> <span class="keyword">None</span>:</div><div class="line"></div><div class="line"> <span class="keyword">return</span> <span class="keyword">None</span></div><div class="line"></div><div class="line"> <span class="keyword">if</span> root.left:</div><div class="line"></div><div class="line"> invertTree(root.left)</div><div class="line"></div><div class="line"> <span class="keyword">if</span> root.right:</div><div class="line"></div><div class="line"> invertTree(root.right)</div><div class="line"></div><div class="line"> root.left, root.right = root.right, root.left</div><div class="line"></div><div class="line"> <span class="keyword">return</span> root</div></pre></td></tr></table></figure>
354345
<p>好了,现在停下来看看这段代码究竟代表着什么——</p>
355346
<p>它的含义是:首先判断节点是否为空;然后翻转左树;然后翻转右树;最后左右互换。</p>
356347
<p>这就是命令式编程——你要做什么事情,你得把达到目的的步骤详细的描述出来,然后交给机器去运行。</p>
@@ -360,20 +351,9 @@ <h1>
360351
<p>所谓“翻转二叉树”,可以看做是要得到一颗和原来二叉树对称的新二叉树。</p>
361352
<p>这颗新二叉树的特点是每一个节点都递归地和原树相反。</p>
362353
<p>用 haskell 代码表达出来就是:</p>
363-
<pre><code class="haskell"><span class="class"><span class="keyword">data</span> <span class="type">Tree</span> a = <span class="type">Node</span> a (<span class="type">Maybe</span> (<span class="type">Tree</span> <span class="title">a</span>)) (<span class="type">Maybe</span> (<span class="type">Tree</span> <span class="title">a</span>))</span>
364-
<span class="keyword">deriving</span> (<span class="type">Show</span>, <span class="type">Eq</span>)
365-
366-
<span class="title">invert</span> :: <span class="type">Maybe</span> (<span class="type">Tree</span> a) -&gt; <span class="type">Maybe</span> (<span class="type">Tree</span> a)
367-
<span class="title">invert</span> <span class="type">Nothing</span> = <span class="type">Nothing</span>
368-
<span class="title">invert</span> (<span class="type">Just</span> <span class="type">Node</span> v l r) = <span class="type">Just</span> (<span class="type">Node</span> v (invert r) (invert l))
369-
</code></pre>
354+
<figure class="highlight haskell"><table><tr><td class="code"><pre><div class="line"><span class="class"><span class="keyword">data</span> <span class="type">Tree</span> a = <span class="type">Nil</span> | <span class="type">Node</span> a (<span class="type">Tree</span> <span class="title">a</span>) (<span class="type">Tree</span> <span class="title">a</span>)</span></div><div class="line"> <span class="keyword">deriving</span> (<span class="type">Show</span>, <span class="type">Eq</span>)</div><div class="line"></div><div class="line"><span class="title">invert</span> :: <span class="type">Tree</span> a -&gt; <span class="type">Tree</span> a</div><div class="line"><span class="title">invert</span> <span class="type">Nil</span> = <span class="type">Nil</span></div><div class="line"><span class="title">invert</span> (<span class="type">Node</span> v l r) = <span class="type">Node</span> v (invert r) (invert l)</div></pre></td></tr></table></figure>
370355
<p>(防止看不懂,翻译成等价的 python )</p>
371-
<pre><code class="python"><span class="function"><span class="keyword">def</span> <span class="title">invert</span><span class="params">(node)</span>:</span>
372-
<span class="keyword">if</span> node <span class="keyword">is</span> <span class="keyword">None</span>:
373-
<span class="keyword">return</span> <span class="keyword">None</span>
374-
<span class="keyword">else</span>
375-
<span class="keyword">return</span> Tree(node.value, invert(node.right), invert(node.left))
376-
</code></pre>
356+
<figure class="highlight python"><table><tr><td class="code"><pre><div class="line"></div><div class="line"><span class="function"><span class="keyword">def</span> <span class="title">invert</span><span class="params">(node)</span>:</span></div><div class="line"></div><div class="line"> <span class="keyword">if</span> node <span class="keyword">is</span> <span class="keyword">None</span>:</div><div class="line"></div><div class="line"> <span class="keyword">return</span> <span class="keyword">None</span></div><div class="line"></div><div class="line"> <span class="keyword">else</span></div><div class="line"></div><div class="line"> <span class="keyword">return</span> Tree(node.value, invert(node.right), invert(node.left))</div></pre></td></tr></table></figure>
377357
<p>这段代码体现的思维,就是旧树到新树的映射——对一颗二叉树而言,它的镜像树就是左右节点递归镜像的树。</p>
378358
<p>这段代码最终达到的目的同样是翻转二叉树,但是它得到结果的方式和 python 代码有着本质的差别:通过描述一个 旧树-&gt;新树 的映射,而不是描述“从旧树得到新树应该怎样做”来达到目的。</p>
379359
<p>那么这样思考有什么好处呢?</p>

tags/functional-programming/index.html

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -111,16 +111,7 @@ <h1>
111111
<p>这是什么意思呢?</p>
112112
<p>假如,现在你来到 google 面试,面试官让你把二叉树镜像反转一下(大雾</p>
113113
<p>几乎不假思索的,就可以写出这样的 Python 代码:</p>
114-
<pre><code class="python"><span class="function"><span class="keyword">def</span> <span class="title">invertTree</span><span class="params">(root)</span>:</span>
115-
<span class="keyword">if</span> root <span class="keyword">is</span> <span class="keyword">None</span>:
116-
<span class="keyword">return</span> <span class="keyword">None</span>
117-
<span class="keyword">if</span> root.left:
118-
invertTree(root.left)
119-
<span class="keyword">if</span> root.right:
120-
invertTree(root.right)
121-
root.left, root.right = root.right, root.left
122-
<span class="keyword">return</span> root
123-
</code></pre>
114+
<figure class="highlight python"><table><tr><td class="code"><pre><div class="line"></div><div class="line"><span class="function"><span class="keyword">def</span> <span class="title">invertTree</span><span class="params">(root)</span>:</span></div><div class="line"></div><div class="line"> <span class="keyword">if</span> root <span class="keyword">is</span> <span class="keyword">None</span>:</div><div class="line"></div><div class="line"> <span class="keyword">return</span> <span class="keyword">None</span></div><div class="line"></div><div class="line"> <span class="keyword">if</span> root.left:</div><div class="line"></div><div class="line"> invertTree(root.left)</div><div class="line"></div><div class="line"> <span class="keyword">if</span> root.right:</div><div class="line"></div><div class="line"> invertTree(root.right)</div><div class="line"></div><div class="line"> root.left, root.right = root.right, root.left</div><div class="line"></div><div class="line"> <span class="keyword">return</span> root</div></pre></td></tr></table></figure>
124115
<p>好了,现在停下来看看这段代码究竟代表着什么——</p>
125116
<p>它的含义是:首先判断节点是否为空;然后翻转左树;然后翻转右树;最后左右互换。</p>
126117
<p>这就是命令式编程——你要做什么事情,你得把达到目的的步骤详细的描述出来,然后交给机器去运行。</p>
@@ -130,20 +121,9 @@ <h1>
130121
<p>所谓“翻转二叉树”,可以看做是要得到一颗和原来二叉树对称的新二叉树。</p>
131122
<p>这颗新二叉树的特点是每一个节点都递归地和原树相反。</p>
132123
<p>用 haskell 代码表达出来就是:</p>
133-
<pre><code class="haskell"><span class="class"><span class="keyword">data</span> <span class="type">Tree</span> a = <span class="type">Node</span> a (<span class="type">Maybe</span> (<span class="type">Tree</span> <span class="title">a</span>)) (<span class="type">Maybe</span> (<span class="type">Tree</span> <span class="title">a</span>))</span>
134-
<span class="keyword">deriving</span> (<span class="type">Show</span>, <span class="type">Eq</span>)
135-
136-
<span class="title">invert</span> :: <span class="type">Maybe</span> (<span class="type">Tree</span> a) -&gt; <span class="type">Maybe</span> (<span class="type">Tree</span> a)
137-
<span class="title">invert</span> <span class="type">Nothing</span> = <span class="type">Nothing</span>
138-
<span class="title">invert</span> (<span class="type">Just</span> <span class="type">Node</span> v l r) = <span class="type">Just</span> (<span class="type">Node</span> v (invert r) (invert l))
139-
</code></pre>
124+
<figure class="highlight haskell"><table><tr><td class="code"><pre><div class="line"><span class="class"><span class="keyword">data</span> <span class="type">Tree</span> a = <span class="type">Nil</span> | <span class="type">Node</span> a (<span class="type">Tree</span> <span class="title">a</span>) (<span class="type">Tree</span> <span class="title">a</span>)</span></div><div class="line"> <span class="keyword">deriving</span> (<span class="type">Show</span>, <span class="type">Eq</span>)</div><div class="line"></div><div class="line"><span class="title">invert</span> :: <span class="type">Tree</span> a -&gt; <span class="type">Tree</span> a</div><div class="line"><span class="title">invert</span> <span class="type">Nil</span> = <span class="type">Nil</span></div><div class="line"><span class="title">invert</span> (<span class="type">Node</span> v l r) = <span class="type">Node</span> v (invert r) (invert l)</div></pre></td></tr></table></figure>
140125
<p>(防止看不懂,翻译成等价的 python )</p>
141-
<pre><code class="python"><span class="function"><span class="keyword">def</span> <span class="title">invert</span><span class="params">(node)</span>:</span>
142-
<span class="keyword">if</span> node <span class="keyword">is</span> <span class="keyword">None</span>:
143-
<span class="keyword">return</span> <span class="keyword">None</span>
144-
<span class="keyword">else</span>
145-
<span class="keyword">return</span> Tree(node.value, invert(node.right), invert(node.left))
146-
</code></pre>
126+
<figure class="highlight python"><table><tr><td class="code"><pre><div class="line"></div><div class="line"><span class="function"><span class="keyword">def</span> <span class="title">invert</span><span class="params">(node)</span>:</span></div><div class="line"></div><div class="line"> <span class="keyword">if</span> node <span class="keyword">is</span> <span class="keyword">None</span>:</div><div class="line"></div><div class="line"> <span class="keyword">return</span> <span class="keyword">None</span></div><div class="line"></div><div class="line"> <span class="keyword">else</span></div><div class="line"></div><div class="line"> <span class="keyword">return</span> Tree(node.value, invert(node.right), invert(node.left))</div></pre></td></tr></table></figure>
147127
<p>这段代码体现的思维,就是旧树到新树的映射——对一颗二叉树而言,它的镜像树就是左右节点递归镜像的树。</p>
148128
<p>这段代码最终达到的目的同样是翻转二叉树,但是它得到结果的方式和 python 代码有着本质的差别:通过描述一个 旧树-&gt;新树 的映射,而不是描述“从旧树得到新树应该怎样做”来达到目的。</p>
149129
<p>那么这样思考有什么好处呢?</p>

0 commit comments

Comments
 (0)