📌  相关文章
📜  国际空间研究组织 | ISRO CS 2017 – 5 月 |问题 71(1)

📅  最后修改于: 2023-12-03 15:23:04.467000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2017 - 5 月 | 问题 71

本题为ISRO CS 2017年5月的一道面试题,主要考察对递归和数学知识的理解。

题目描述

一个函数 foo(int x) 接收一个整数参数 x。定义函数 foo 如下:

  • x < 1 则返回 x
  • x 为偶数,则返回 foo(x/2) + 1
  • x 为奇数,则返回 foo((x-1)/2) + foo((x+1)/2) + 1

foo(2017) 的值。

解题思路

题目要求我们求出 foo(2017) 的值,根据函数定义,我们需要先求出 foo(1009)foo(1008) 的值。这两个值都是奇数,需要进行递归调用。

对于 foo(1009),我们可以根据定义式计算得到:

foo(1009) = foo(504) + foo(505) + 1
          = foo(252) + 1 + foo(253) + 1 + 1
          = foo(126) + 1 + foo(127) + 1 + 1 + 1 + 1
          = foo(63) + 1 + foo(64) + 1 + 1 + 1 + 1 + 1 + 1
          = foo(31) + 1 + foo(32) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
          = foo(15) + 1 + foo(16) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
          = foo(7) + 1 + foo(8) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
          = foo(3) + 1 + foo(4) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
          = 3 + 1 + 2 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
          = 18

对于 foo(1008),根据定义式计算得到:

foo(1008) = foo(504) + 1
          = foo(252) + 1 + 1
          = foo(126) + 1 + 1 + 1
          = foo(63) + 1 + 1 + 1 + 1
          = foo(31) + 1 + 1 + 1 + 1 + 1
          = foo(15) + 1 + 1 + 1 + 1 + 1 + 1
          = foo(7) + 1 + 1 + 1 + 1 + 1 + 1 + 1
          = foo(3) + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
          = 3 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
          = 11

最终,我们可以根据定义式计算得到 foo(2017) 的值:

foo(2017) = foo(1009) + foo(1008) + 1
          = 18 + 11 + 1
          = 30

因此, foo(2017) 的值为 30

代码实现

函数 foo(int x) 的C++实现如下:

int foo(int x) {
    if (x < 1) return x;
    if (x % 2 == 0) return foo(x / 2) + 1;
    return foo((x - 1) / 2) + foo((x + 1) / 2) + 1;
}

cout << foo(2017);  // 输出 30