递归算阶层

转载 2011年01月10日 17:17:00

昨天去公司面试,有个题目叫:用递归算100的阶层,想了好久!!!
用最简单的求阶层函数来举例:
n! = n*(n-1)*(n-2)***2*1

常见的递归实现如下:
int fun(int n)
{
if( n<=1 ) return 1;
return n*fun(n-1);
}
不用多说,这个实现下每次递归调用都会在当前层的工作记录中分配一个4字节(IBM兼容机)的空间来存放n的值。若栈的深度为DEPTH,那么一共需要DEPTH×4个字节存放参数。

那么能不能避免这些存储空间呢,我们来看看引用的情况:
int fun(int &n)
{
if( n<=1 ) return 1;
return n*fun(n-1);
}
这段代码编译不能通过,原因是n-1只是一个右值。这里简单介绍一下c++中的无名对象(变量)。c++中的无名对象与const常量有些相似,他们都只能做右值而不能做左值,区别是const常量是有地址的可以取地址,而无名对象一般是不可以的。这里n-1有点无名对象的味道,因为fun要求一个变量引用。由于n-1是右值,所以把参数类型改成int fun(const int & n)就可以了。

int fun(const int &n)
{
if( n<=1 ) return 1;
return n*fun(n-1);
}
现在运行通过了,但是栈空间需求仍然没有减少,因为引用的是无名对象,无名对象只是寄存器中的一个值,是没有RAM地址的。所以每递归调用一次,就会在工作记录中分配空间来存放n-1,实际效果相当于const int n = n-1;

那么换个思路。以上程序之所以如此是因为传给递归函数的不是n本身,现设计如下:
int fun(const int & n)
{
cout<<(long)&n<<endl;
if( n<=1 ) return 1;
--n;
return (n+1)*fun(n);

相关文章推荐

用递归方法求n的阶乘。

/* * Copyright (c) 2012, 烟台大学计算机学院 * All rights reserved. * 作 者: 刘同宾 ...

【万字总结】探讨递归与迭代的区别与联系及如何求解10000的阶层

递归和迭代这两个概念也许很多童鞋依旧是老虎老鼠傻傻分不清楚,下面通过求解斐波那契数来看看它们俩的关系吧。斐波那契数的定义: f0=0 f_0 = 0 f1=1 f_1 = 1 fi=fi−1...
  • NoMasp
  • NoMasp
  • 2015年12月12日 11:32
  • 2600

经典递归问题--快算24 POJ--3983

经典递归问题--快算24 POJ--3983

几个递归练习题问题(迷宫,算24,小游戏,碎纸机)

迷宫   题目要求: 一天 Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由 n * n 的格点组成,每个格点只有 2 种状态,.和#,前者表示可以通行后者表示不能通行。...

C# 算兔子的算法 要求用递归

C# 算兔子的算法 要求用递归,面试题 有一网友,在百度知道寻问一道面试题,题目如下: 一对小兔子一年后长成大兔子;一对大兔子每半年生一对小兔子。大兔子的繁殖期为4年,兔子的寿命是6年。假...

累加、迭代、递推、穷举、递归 ,等运算,笔记

8、计算   8.1累加: 累加:将一系列的数据加到一个变量里面,最后得到了累加的结果。   一般形式: 累加:V+=e; 累积:V*=e; V代表累加和累积,e代表累加累积项。 算...

数据结构-非递归遍历二叉树

  • 2017年11月16日 10:28
  • 216KB
  • 下载

读后有感 - 媒体称教育减负加剧阶层分化 贫民子弟受损

读后有感 - 媒体称教育减负加剧阶层分化 贫民子弟受损
  • sleks
  • sleks
  • 2015年10月20日 09:53
  • 1157

递归建树与按行打印

  • 2017年11月03日 09:40
  • 760B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:递归算阶层
举报原因:
原因补充:

(最多只允许输入30个字)