加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 创业 > C语言 > 正文

尾递归逻辑优化

发布时间:2020-12-15 01:20:33 所属栏目:C语言 来源:网络整理
导读:pre class="de1"? span class="kw1"function tcospan class="br0"( fspan class="br0") span class="br0"{ ? ? span class="kw1"var valuespan class="sy0"; ? ? span class="kw1"var active span class="sy0"= span class="kw2"false span class="sy0"; ? ?

<pre class="de1">?
<span class="kw1">function tco<span class="br0">(f<span class="br0">) <span class="br0">{
? ? <span class="kw1">var value<span class="sy0">;
? ? <span class="kw1">var active <span class="sy0">= <span class="kw2">false<span class="sy0">;
? ? <span class="kw1">var accumulated <span class="sy0">= <span class="br0">[<span class="br0">]<span class="sy0">;
?
? ? <span class="kw1">return <span class="kw1">function accumulator<span class="br0">(<span class="br0">) <span class="br0">{
? ? ? ? accumulated.<span class="me1">push<span class="br0">(arguments<span class="br0">)<span class="sy0">;
?
? ? ? ? <span class="kw1">if <span class="br0">(<span class="sy0">!active<span class="br0">) <span class="br0">{
? ? ? ? ? ? active <span class="sy0">= <span class="kw2">true<span class="sy0">;
?
? ? ? ? ? ? while <span class="br0">(accumulated.<span class="me1">length<span class="br0">) <span class="br0">{
? ? ? ? ? ? ? ? value <span class="sy0">= f.<span class="me1">apply<span class="br0">(<span class="kw1">this<span class="sy0">, accumulated.<span class="me1">shift<span class="br0">(<span class="br0">)<span class="br0">)<span class="sy0">;
? ? ? ? ? ? <span class="br0">}
?
? ? ? ? ? ? active <span class="sy0">= <span class="kw2">false<span class="sy0">;
?
? ? ? ? ? ? <span class="kw1">return value<span class="sy0">;
? ? ? ? <span class="br0">}
? ? <span class="br0">}
<span class="br0">}
<span class="co1">//这种方式确实有点奇怪,但的确没有改动很多源码,只是以直接量的形式使用tco函数包裹源码
<span class="kw1">var sum <span class="sy0">= tco<span class="br0">(<span class="kw1">function<span class="br0">(x<span class="sy0">, y<span class="br0">) <span class="br0">{
? ? <span class="kw1">if <span class="br0">(y <span class="sy0">> <span class="nu0">0<span class="br0">) <span class="br0">{
? ? ? <span class="kw1">return sum<span class="br0">(x <span class="sy0">+ <span class="nu0">1<span class="sy0">, y <span class="sy0">- <span class="nu0">1<span class="br0">)
? ? <span class="br0">}
? ? <span class="kw1">else <span class="br0">{
? ? ? <span class="kw1">return x
? ? <span class="br0">}
<span class="br0">}<span class="br0">)<span class="sy0">;
sum<span class="br0">(<span class="nu0">1<span class="sy0">, <span class="nu0">10<span class="br0">) <span class="co1">// => 11
sum<span class="br0">(<span class="nu0">1<span class="sy0">, <span class="nu0">100000<span class="br0">) <span class="co1">// => 100001 没有造成栈溢出

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读