为何用succ/pred实现翻倍的C代码未输入y却能正确运行?
代码解析与疑问解答
你的代码
#include<stdio.h> const char *author ="Alexandre Santos"; int succ(int x) { return x+1; } int pred(int x) { return x-1; } int is_zero(int x) { return x == 0; } int is_pos(int x) { return x >= 0; } int sum(int x, int y) { return is_zero(y)? x: sum(succ(x),pred(y)); } int twice(int x) { return sum(succ(x), pred(x)); } int main(void) { int x; scanf("%d", &x); int z = twice(x); printf("%d\n", z); return 0; }
核心疑问解析:sum的y从哪来?
你不需要从输入单独获取y,因为twice(x)调用sum时,已经根据输入的x计算出了y的取值:
succ(x)等价于x+1,作为sum的第一个参数pred(x)等价于x-1,作为sum的第二个参数(也就是你疑惑的y)
sum的y是由输入x推导出来的,不是需要额外输入的变量。
逐函数拆解运行逻辑
1. sum函数的递归加法逻辑
sum用递归实现了加法:
- 如果y是0,直接返回x(因为x+0=x)
- 如果y不是0,就递归调用
sum(succ(x), pred(y))——相当于把x加1,y减1,重复这个过程直到y变成0
举个例子:计算sum(4,2)
- y=2≠0 → 调用
sum(5,1) - y=1≠0 → 调用
sum(6,0) - y=0 → 返回6,也就是4+2=6
2. twice函数的两倍计算逻辑
twice里调用sum(succ(x), pred(x)),代入数学公式就是:(x+1) + (x-1) = x+1+x-1 = 2x,刚好是x的两倍。
用具体数值验证,比如输入x=3:
twice(3)→sum(4,2)- 按sum的递归逻辑,最终返回6,也就是3×2=6,结果正确。
3. 整体流程
输入x → 进入twice函数 → 计算出sum的两个参数(x+1和x-1)→ sum递归算出两者的和(即2x)→ 输出结果
内容的提问来源于stack exchange,提问作者Alexandre Santos
相关产品推荐
相关产品推荐

