尾递归 博客分类: 算法 Erlang算法CC++C#

递归很常用,但是很耗内存,因为需要存储临时变量,当递归次数多了,占据的内存数量惊人。

如下, 是阶乘的递归:

int function(n) {
    return n==1?1:function(n-1)*n;
}

  还有更好的递归算法,称为尾递归。这种方式不需要存储临时变量。因为是从erlang中学到的,所以先给出erlang的实现方法:

-module(test).
-export([fac/1]).
fac(N) -> fac_temp(N, 1).
fac_temp(1, X) -> X;
fac_temp(N, X) -> fac_temp(N - 1, N + X).

 C的版本如下:

int funcTemp(int num, int n) {//中间方法,多了个起始值             
  if(num<=1) return n;
  return funcTemp(num-1, n*num);
}
int func(int num) {//调用这个方法,默认起始值为1
    return funcTemp(num, 1);
}

 学习erlang的时候,学到了这个尾递归,很有收获。所以嘛,专精一门,广泛涉猎其他技术,非常有好处。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏带你撸出一手好代码

kotlin语言使用初体验(一)

居说谷歌新认的干儿子kotlin极为受宠,隐隐有替代Java在 android平台老大位置的趋势。kotlin有谷歌撑腰,加上自己的底子也厚,再之与Java无缝...

3375
来自专栏量子位

干货 | 如何写一个更好的Python函数?

《Writing Idiomatic Python》一书的作者在Medium上发表了一篇文章,给出了6个建议。

872
来自专栏皮皮之路

【JDK1.8】Java 8源码阅读汇总

3727
来自专栏用户2442861的专栏

C++ 智能指针详解

http://blog.csdn.net/xt_xiaotian/article/details/5714477

3811
来自专栏Flutter入门到实战

封装工厂类创建BottomNavigationBar的addItem

●  工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

942
来自专栏编程

手把手教你半个小时用python语言编程出你的第一个程序

学习目标 知道有序的软件开发过程的步骤。 了解遵循输入、处理、输出(IPO)模式的程序,并能够以简单的方式修改它们。 了解构成有效Python标识符和表达式的规...

3445
来自专栏PHP在线

PHP程序员容易忽略的几点精华

1、变量、数组的应用技巧   (1)很多人用得不多的数组函数。foreach、list、each。分别举几个例子,应该就能知道了。例:   $dat...

36210
来自专栏灯塔大数据

技术 | Python从零开始系列连载(二十七)

为了解答大家学习Python时遇到各种常见问题,小灯塔特地整理了一系列从零开始的入门到熟练的系列连载,每周五准时推出,欢迎大家学积极学习转载~

1093
来自专栏java学习

java每日一练(2017/8/24)

最新通知 ●回复"每日一练"获取以前的题目! ●【新】Android视频更新了!(回复【安卓视频】获取下载链接) ●【新】Ajax知识点视频更新了!(回复【学习...

36416
来自专栏磐创AI技术团队的专栏

干货 | 如何写一个更好的Python函数?

《Writing Idiomatic Python》一书的作者在Medium上发表了一篇文章,给出了6个建议。

731

扫码关注云+社区