递归算法

2024年8月23日 | 分类: 【编程】

【题目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) 的返回结果。下面是该过程的迭代步骤:

  1. 调用 solve(7)

    • 由于 7 >= 5,我们执行 return n * solve(n-2)

    • 这将变为 7 * solve(5)

  2. 调用 solve(5)

    • 由于 5 >= 5,我们执行 return n * solve(n-2)

    • 这将变为 5 * solve(3)

  3. 调用 solve(3)

    • 由于 3 < 5,我们执行 return n * solve(n-1)

    • 这将变为 3 * solve(2)

  4. 调用 solve(2)

    • 由于 2 < 5,我们执行 return n * solve(n-1)

    • 这将变为 2 * solve(1)

  5. 调用 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】

2021年CSP-S-初赛试卷及解析


第11题