【题目1】
考虑如下递归算法:
solve(n) if n<=1 return 1 else if n>=5 return n*solve(n-2) else return n*solve(n-1)
则调用solve(7)得到的返回结果为( )。
A. 105
B. 840
C. 210
D. 420
【解析1】
完全二叉树第 5 层最多有 \(2^4=16\) 个节点。
那么从左往右依次可以有连续 \(k(1\leqslant{k}\leqslant{16})\) 个节点。一共有 16 种情况。
答案:A
【解析2】
参考:http://yncoders.com/show/675
可以通过手动执行递归算法来找出调用 solve(7)
的返回结果。下面是该过程的迭代步骤:
-
调用
solve(7)
: -
由于
7 >= 5
,我们执行return n * solve(n-2)
。 -
这将变为
7 * solve(5)
。 -
调用
solve(5)
: -
由于
5 >= 5
,我们执行return n * solve(n-2)
。 -
这将变为
5 * solve(3)
。 -
调用
solve(3)
: -
由于
3 < 5
,我们执行return n * solve(n-1)
。 -
这将变为
3 * solve(2)
。 -
调用
solve(2)
: -
由于
2 < 5
,我们执行return n * solve(n-1)
。 -
这将变为
2 * solve(1)
。 -
调用
solve(1)
: -
n <= 1
,所以我们返回1
。
回到步骤 4,我们得到 2 * 1 = 2
,然后回到步骤 3,我们得到 3 * 2 = 6
,再回到步骤 2,我们得到 5 * 6 = 30
,最后回到步骤 1,我们得到 7 * 30 = 210
。
因此,调用 solve(7)
的返回结果为 210。所以答案是选项 C.210。
【题目2】
第11题