Update Recursion example to demonstrate recursive closures

Fixes #389
This commit is contained in:
Eli Bendersky 2021-09-02 05:53:30 -07:00
parent 2acace92c0
commit d037acd3e6
4 changed files with 80 additions and 6 deletions

View File

@ -17,4 +17,21 @@ func fact(n int) int {
func main() {
fmt.Println(fact(7))
// Closures can also be recursive, but this requires the
// closure to be declared with a typed `var` explicitly
// before it's defined.
var fib func(n int) int
fib = func(n int) int {
if n < 2 {
return n
}
return fib(n-1) + fib(n-2)
// Since `fib` was previously declared in `main`, Go
// knows which function to call with `fib` here.
}
fmt.Println(fib(7))
}

View File

@ -1,2 +1,2 @@
9bfb2f870007082835a3c0efaac9aa1c3bc2c15c
smWim1q9ofu
55d9633a4f0fd0eac2f243b2a2ddb35ae91ed4a9
LnBMavPrkuf

View File

@ -1,2 +1,3 @@
$ go run recursion.go
5040
13

64
public/recursion generated
View File

@ -43,7 +43,7 @@ Here&rsquo;s a classic factorial example.</p>
</td>
<td class="code leading">
<a href="http://play.golang.org/p/smWim1q9ofu"><img title="Run code" src="play.png" class="run" /></a><img title="Copy code" src="clipboard.png" class="copy" />
<a href="http://play.golang.org/p/LnBMavPrkuf"><img title="Run code" src="play.png" class="run" /></a><img title="Copy code" src="clipboard.png" class="copy" />
<pre class="chroma"><span class="kn">package</span> <span class="nx">main</span>
</pre>
</td>
@ -83,10 +83,65 @@ base case of <code>fact(0)</code>.</p>
<td class="docs">
</td>
<td class="code">
<td class="code leading">
<pre class="chroma"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
<span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nf">fact</span><span class="p">(</span><span class="mi">7</span><span class="p">))</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
<p>Closures can also be recursive, but this requires the
closure to be declared with a typed <code>var</code> explicitly
before it&rsquo;s defined.</p>
</td>
<td class="code leading">
<pre class="chroma">
<span class="kd">var</span> <span class="nx">fib</span> <span class="kd">func</span><span class="p">(</span><span class="nx">n</span> <span class="kt">int</span><span class="p">)</span> <span class="kt">int</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
</td>
<td class="code leading">
<pre class="chroma"> <span class="nx">fib</span> <span class="p">=</span> <span class="kd">func</span><span class="p">(</span><span class="nx">n</span> <span class="kt">int</span><span class="p">)</span> <span class="kt">int</span> <span class="p">{</span>
<span class="k">if</span> <span class="nx">n</span> <span class="p">&lt;</span> <span class="mi">2</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">n</span>
<span class="p">}</span>
<span class="k">return</span> <span class="nf">fib</span><span class="p">(</span><span class="nx">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="nf">fib</span><span class="p">(</span><span class="nx">n</span><span class="o">-</span><span class="mi">2</span><span class="p">)</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
<p>Since <code>fib</code> was previously declared in <code>main</code>, Go
knows which function to call with <code>fib</code> here.</p>
</td>
<td class="code leading">
<pre class="chroma">
<span class="p">}</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
</td>
<td class="code">
<pre class="chroma"> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nf">fib</span><span class="p">(</span><span class="mi">7</span><span class="p">))</span>
<span class="p">}</span>
</pre>
</td>
@ -103,7 +158,8 @@ base case of <code>fact(0)</code>.</p>
<td class="code">
<pre class="chroma"><span class="gp">$</span> go run recursion.go
<span class="go">5040</span></pre>
<span class="go">5040
</span><span class="go">13</span></pre>
</td>
</tr>
@ -120,7 +176,7 @@ base case of <code>fact(0)</code>.</p>
</div>
<script>
var codeLines = [];
codeLines.push('');codeLines.push('package main\u000A');codeLines.push('import \"fmt\"\u000A');codeLines.push('func fact(n int) int {\u000A if n \u003D\u003D 0 {\u000A return 1\u000A }\u000A return n * fact(n-1)\u000A}\u000A');codeLines.push('func main() {\u000A fmt.Println(fact(7))\u000A}\u000A');codeLines.push('');
codeLines.push('');codeLines.push('package main\u000A');codeLines.push('import \"fmt\"\u000A');codeLines.push('func fact(n int) int {\u000A if n \u003D\u003D 0 {\u000A return 1\u000A }\u000A return n * fact(n-1)\u000A}\u000A');codeLines.push('func main() {\u000A fmt.Println(fact(7))\u000A');codeLines.push(' var fib func(n int) int\u000A');codeLines.push(' fib \u003D func(n int) int {\u000A if n \u003C 2 {\u000A return n\u000A }\u000A return fib(n-1) + fib(n-2)\u000A');codeLines.push(' }\u000A');codeLines.push(' fmt.Println(fib(7))\u000A}\u000A');codeLines.push('');
</script>
<script src="site.js" async></script>
</body>