You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何用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)

  1. y=2≠0 → 调用sum(5,1)
  2. y=1≠0 → 调用sum(6,0)
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 05:30:42