选择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