📅  最后修改于: 2023-12-03 15:23:04.467000             🧑  作者: Mango
本题为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