递归,尾递归,与循环!仅为个人记录

递归可能会用到代码段,静态数据区,堆与栈。

递归阶乘:

int factorial(int n)

{

if (n < 0)

  return 0;

else if(n==0)

  return 1;

else if(n==1)

  return 1;

else

  return n * factorial( n-1 );

}

尾递归:所有递归形式都出现在了函数的末尾。是函数参数的覆盖?

尾递归阶乘:

int factorial_tail(int n, int a)

{

if (n < 0)

  return 0;

else if(n==0)

  return 1;

else if(n==1)

  return a;

else

  return factorial_tail( n-1, n * a);

}

将递归算法转换为非递归算法有两种方法,一种是直接求值,不需要回溯;另一种是不能直接求值,需要回溯。 前者使用一些变量保存中间结果,称为直接转换法;后者使用栈保存中间结果,称为间接转换法。

int fact(int n) 

{

int s=0; 

for (int i=1; i <=n;i++)

s=s*i; //用s保存中间结果 

return s; 

}

尾递归和循环的执行效率都非常高。但是尾递归的递归层数大到一定程度会出现段错误。
尾递归的函数栈开销比普通递归要小的多,执行效率也要大很多。 但是并不是说尾递归就没有函数栈开销。
正因为尾递归具有函数栈开销,其计算极限要比非递归(循环)小很多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值