递归_算法题解2


选择B:

递归工作栈里面包括返回地址、本层的局部变量和递归调用的形参代换用实参,所以正常情况下,无论递归过程有没有使用局部变量,转换为非

递归过程 都需要用栈来模拟这个递归调用过程  。

当然,有一些特殊递归不用栈就可以直接转换,比如尾递归、常系数递推等,无论是否有局部变量




直接排除AD,注意力集中在B和C。


B肯定是对的,只有一次循环满足某个条件,不调用自己就返回,递归才会一层一层向上返回。


那么C呢,想一下,全局变量和参数确实可以用来控制递归的结束与否。 


该不该选C呢?再仔细看一下题目(说实话,我很讨厌这种文字游戏),“这个函数一定...“,所以,问题集中在,是否是一定会使用这两种方式呢? 显然


不是的。


除了C中提到的两种情况外,还有如下控制递归的方式: 


1. 局部静态变量是可以控制递归函数最终结束的


 2. 可能通过异常来控制递归的结束。 


3. 可以利用BIOS或OS的一些数据或一些标准库的全局值来控制递归过程的终止。 


4. 可以把一些数据写入到BIOS或OS的系统数据区,也可以把数据写入到一个文件中,以此来控制递归函数的终止。


 所以,答案为B






func(5) = 5 * func(4)

            = 5 * 4 * func(3)

            = 5 * 4 * 3 * func(2)

            = 5 * 4 * 3 * 2 * func(1)

            =    5 * 4 * 3 * 2 *  1

              = 120





类似斐波那契数列的思想,若所求方法表示为f(n),因为当台阶大于 3 时,可看做是

f(n)=f(n- 1 )+f(n- 2 )+f(n- 3 ); //因为踏入最后一节阶梯有三种方法,最后一步是一步,两步,三步。

代码如下:
         public  static  void main(String[] args) {
         int  f1 =  1 ;
         int  f2 =  2 ;
         int  f3 =  4 ;
         int  result =  0 ;
         for ( int  i =  4 ; i <=  15 ; i++){
             result = f1 + f2 + f3;
             f1 = f2;
             f2 = f3;
             f3 = result;
         }
         System.out.println(result);
     }



ack(0,n) = n+1,ack(0,1)=2,ack(1,0)=ack(0,1)=2

ack(1,n) = ack(0,ack(1,n-1))=ack(1,n-1)+1

An = An-1 + 1  推出递推公式为An=n+1,即ack(1,n)=n+2

ack(2,n) = ack(1,ack(2,n-1))=ack(2,n-1)+2

ack(2,0) = ack(1,1)=3

类似的:ack(2,n)= 2n+3

ack(3,n) = ack(2,ack(3,n-1))= 2ack(3,n-1)+3

ack(3,n) + 3 = 2(ack(3,n-1) + 3)

ack(3,0) = 5

等比公式: ack(3,n)=2^(n+3)-3 

故:ack(3,3)=61

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhisheng_blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值