递归算阶层

转载 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);

关于递归实现过程的详解

最近在学数据结构的时候,碰到了递归,但由于自己一直对递归一知半解,所以不能全面的理解递归的过程到底是怎样实现的,下来研究了一下,觉得还是有所收获的。  假设我们用递归实现一个数的阶乘。int fun...
  • qq_32998153
  • qq_32998153
  • 2016年11月16日 21:36
  • 1756

C/C++程序——递归和循环实现阶乘,并比较N!与(2N N)的大小

递归和循环实现阶乘,并比较N!与(2N N)的大小
  • GreatcloudL
  • GreatcloudL
  • 2017年06月24日 10:53
  • 494

用递归和迭代这两种方法求n的阶层:n!

用递归和迭代这两种方法求n的阶层:n!
  • xiaochenxiaoren
  • xiaochenxiaoren
  • 2017年11月19日 15:15
  • 187

求阶乘 递归实现和非递归实现

一个数的阶乘就是这个数连乘每个比前一个数小1的数,例如5的阶乘是:5 * 4 * 3 * 2 * 1,  0和1的阶乘是1.用公式实现: fac(n) =           1           ...
  • NaN_Lovelance
  • NaN_Lovelance
  • 2016年09月04日 16:01
  • 7523

C语言中return 0/return(0)的作用

int main(void){}则通常需要给函数返回一个数值,一般,return 0表示这个函数已经被正常地执行完毕以跳出该程序.如果定义函数为void类型或者没有定义类型,通常不需要return 0...
  • tykw163
  • tykw163
  • 2008年03月24日 11:59
  • 5048

递归程序设计心得与体会

用递归设计出来的程序总是简洁易读,极具美感。但是对于刚入门的学者来说,当遇到递归场景时,自己却难以正确的设计出合理的递归程序。博主曾经也是困惑不已,写的多了,也就渐渐的熟悉了递归设计。特谈一下自己的感...
  • uestclr
  • uestclr
  • 2016年06月19日 16:59
  • 3806

iOS面试之递归算法博主菜鸟历程第一卷

10块钱买5瓶酒,2个瓶盖换一瓶,4个酒瓶换一瓶。问10块钱能买多少瓶酒?递归算法解决 这面试题是菜鸟博主我一位同学发过来,现在iOS真的越来越难找工作了 #import "ViewContr...
  • qq_26515049
  • qq_26515049
  • 2016年05月06日 13:57
  • 1310

php递归函数求一个数的阶乘

求一个数a的阶乘,那么,a!=a*(a-1)*(a-2)*(a-3)*……*2*1.比如,6的阶乘6!=6*5*4*3*2*1=720.那么,如何通过php代码实现求任意一个数的阶乘? ...
  • maminyao
  • maminyao
  • 2012年04月13日 22:37
  • 6984

递归算阶层

昨天去公司面试,有个题目叫:用递归算100的阶层,想了好久!!!用最简单的求阶层函数来举例:n! = n*(n-1)*(n-2)***2*1常见的递归实现如下:int fun(int n){ ...
  • liushine2010
  • liushine2010
  • 2011年01月10日 17:17
  • 1127

第四周项目(5)-递归求阶乘

 /* *copyright (c) 2016,烟台大学计算机学院 *All rights reserved. *文件名称:hellow.cpp *作者:田甜 *完成日期:2016年3...
  • sweetsweet1997
  • sweetsweet1997
  • 2016年03月25日 16:05
  • 197
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:递归算阶层
举报原因:
原因补充:

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