如何利用给定递归sum函数实现数字翻倍程序?
解决方案:把递归求和程序改成计算数字两倍值的程序
嘿,别担心!刚接触编程遇到这种小问题太正常了,我来帮你把这个程序改对,还会给你讲清楚每一步的思路~
首先,先帮你理清楚原来的程序是干啥的:
原来的
sum函数是用递归实现两个数相加:每次把x加1,y减1,直到y变成0,最后返回的就是x+y的结果。main函数里是输入两个整数,调用sum求和后输出。
你的需求是输入一个数字,返回它的两倍(比如输入2返回4),本质上就是计算x*2,而x*2其实等于x+x——刚好可以利用原来的递归求和逻辑!当然也可以直接修改成专门计算两倍的递归函数,我给你两种简单的改法:
方法1:最小改动——复用原来的sum函数
这种方法不用改sum函数的逻辑,只需要修改main函数的输入和调用方式,非常适合新手快速完成需求:
// Sum, recursive, using only elementary operations #include <stdio.h> int sum(int x, int y) { return y == 0 ? x : sum(x+1, y-1); } int main(void) { int x; // 只需要输入一个数字x,不需要y了 scanf("%d", &x); // 调用sum(x, x),相当于计算x+x,也就是2*x int z = sum(x, x); printf("%d\n", z); return 0; }
改动说明:
- 删掉了
main里的int y;,因为现在只需要一个输入值 - 把
scanf("%d%d", &x, &y);改成scanf("%d", &x);,只读取一个整数 - 调用
sum的时候传两个x,这样sum(x,x)就会递归计算x+x,结果就是x的两倍
方法2:改写sum为专门计算两倍的递归函数
如果你想彻底改成只处理单输入的逻辑,也可以把sum函数改成double_num,专门计算数字的两倍,逻辑更清晰:
#include <stdio.h> // 递归计算x的两倍:x==0时返回0,否则返回前一个数的两倍加2 int double_num(int x) { return x == 0 ? 0 : double_num(x-1) + 2; } int main(void) { int x; scanf("%d", &x); int z = double_num(x); printf("%d\n", z); return 0; }
逻辑解释:
比如输入2的时候:
double_num(2)会调用double_num(1)+2double_num(1)会调用double_num(0)+2double_num(0)返回0- 所以最终是
0+2+2=4,正好是2的两倍
为什么你之前的尝试没成功?
你说想删除y相关代码并替换为重复操作,方向是对的!可能是没处理好递归的终止条件,或者输入输出的部分——比如如果删掉了y但没改scanf的格式,程序会卡住等待输入;或者修改递归逻辑时没找对终止条件。慢慢来,多试几次就能掌握啦~
内容的提问来源于stack exchange,提问作者ImDumb
相关产品推荐
相关产品推荐

