<p>对于一百万位的记忆,递归堆栈将非常大。我们可以先看看一个足够大的数字,我们可以用手来计算,<code>fusc(71)</code>在这种情况下:</p>
<blockquote>
<p>fusc(71) = fusc(35) + fusc(36)</p>
<blockquote>
<p>fusc(35) = fusc(17) + fusc(18)<br/>
fusc(36) = fusc(18) </p>
</blockquote>
<p>fusc(71)=1*fusc(17)+2*fusc(18)</p>
<blockquote>
<p>fusc(17) = fusc(8) + fusc(9)<br/>
fusc(18) = fusc(9)</p>
</blockquote>
<p>fusc(71)=1*fusc(8)+3*fusc(9)</p>
<blockquote>
<p>fusc(8) = fusc(4)<br/>
fusc(9) = fusc(4) + fusc(5)</p>
</blockquote>
<p>fusc(71)=4*fusc(4)+3*fusc(5)</p>
<blockquote>
<p>fusc(4) = fusc(2)<br/>
fusc(3) = fusc(1) + fusc(2)</p>
</blockquote>
<p>fusc(71)=7*fusc(2)+3*fusc(3)</p>
<blockquote>
<p>fusc(2) = fusc(1)<br/>
fusc(3) = fusc(1) + fusc(2)</p>
</blockquote>
<p>fusc(71)=11*fusc(1)+3*fusc(2)</p>
<blockquote>
<p>fusc(2) = fusc(1)</p>
</blockquote>
<p>fusc(71)=14*fusc(1)=14</p>
</blockquote>
<p>我们意识到在这种情况下,我们可以完全避免递归,因为我们总是可以用<code>a * fusc(m) + b * fusc(m+1)</code>的形式来表达<code>fusc(n)</code>,同时将m的值减少到0。从上面的示例中,您可能会发现以下模式:</p>
<blockquote>
<p>if m is odd:<br/>
<code>a * fusc(m) + b * fusc(m+1)</code> = <code>a * fusc((m-1)/2) + (b+a) * fusc((m+1)/2)</code><br/>
if m is even:<br/>
<code>a * fusc(m) + b * fusc(m+1)</code> = <code>(a+b) * fusc(m/2) + b * fusc((m/2)+1)</code></p>
</blockquote>
<p>因此,您可以使用一个简单的循环函数在O(lg(n))时间内解决问题</p>
<pre><code>def fusc(n):
if n == 0: return 0
a = 1
b = 0
while n > 0:
if n%2:
b = b + a
n = (n-1)/2
else:
a = a + b
n = n/2
return b
</code></pre>