递归_算法题解2

来源:互联网 发布:sql server 2016正式版 编辑:程序博客网 时间:2024/05/16 06:32


选择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 voidmain(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 0