函数 gcd(int a, int b) 定义如下,则 gcd(105, 45) 的结果是( )。
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}看到递归函数直接联想到辗转相除法的标准实现。核心观察是每次递归把较大数替换为余数,直到余数为0。105%45=15,45%15=0,递归终止时返回15。这类题本质是考察对递归调用栈的理解,而非复杂计算。
选项A把105%45算错成3,选项B把45%15算错成5,选项D误以为b=0时返回b。题目最阴险的是b=0的终止条件,很多考生会忽略递归的终止点,直接认为gcd(a,b)=a。
GESP五级算法模块,考察递归调用与辗转相除法的结合。命题人卡住的是考生对递归终止条件的敏感度——五级考生普遍能写出递归框架,但一到具体数值就慌神,这道题就是专门测试"能不能冷静算完递归链"。
看到递归函数直接联想到辗转相除法的标准实现。核心观察是每次递归把较大数替换为余数,直到余数为0。105%45=15,45%15=0,递归终止时返回15。这类题本质是考察对递归调用栈的理解,而非复杂计算。
选项A把105%45算错成3,选项B把45%15算错成5,选项D误以为b=0时返回b。题目最阴险的是b=0的终止条件,很多考生会忽略递归的终止点,直接认为gcd(a,b)=a。
如果把a,b换成质数如(7,13),gcd(7,13)会递归到gcd(13,7)->gcd(7,6)->gcd(6,1)->gcd(1,0)=1,答案变成1。若把终止条件改成b==1,则gcd(105,45)会返回1而不是15,题目难度会陡增。