面试题答案
一键面试思路
- 利用递归宏定义:宏定义可以进行递归展开。对于斐波那契数列,我们知道其递归公式为
F(n) = F(n - 1) + F(n - 2)
,F(0) = 0
,F(1) = 1
。通过宏递归展开,在编译期就计算出指定项的斐波那契数。 - 避免无限递归:为了防止宏的无限递归,需要设置递归终止条件,即当
n
为0
或1
时,直接返回相应的结果。
关键代码实现
#include <stdio.h>
// 定义计算斐波那契数列的宏
#define FIBONACCI(n) ((n) == 0? 0 : ((n) == 1? 1 : FIBONACCI(n - 1) + FIBONACCI(n - 2)))
int main() {
int n = 10;
// 在编译期计算斐波那契数列第10项的值
int result = FIBONACCI(n);
printf("The %dth Fibonacci number is %d\n", n, result);
return 0;
}
在上述代码中:
FIBONACCI(n)
宏根据n
的值进行判断,如果n
为0
则返回0
,如果n
为1
则返回1
,否则递归调用FIBONACCI(n - 1)
和FIBONACCI(n - 2)
并将结果相加。- 在
main
函数中,定义n
为10
,并通过宏计算斐波那契数列第10
项的值并输出。
注意:虽然这种方法可以在编译期完成计算,但对于较大的 n
值,宏的递归展开可能会导致编译时间过长甚至编译器内存耗尽,因为每次递归展开都会增加编译时的处理量。实际应用中,要根据具体情况权衡利弊。