递归实现数字反转重复输出问题:如何仅打印一次结果?
解决递归反转数字时重复打印的问题
你的代码里,printReverse函数中的printf("%d ",rev);语句会在递归的每一层回溯时执行。以输入1234为例,递归调用链是printReverse(1234)→printReverse(123)→printReverse(12)→printReverse(1)→printReverse(0),当递归触达base case(n=0)后开始逐层返回,每一层都会执行一次printf,所以最终会打印4次反转结果。
下面提供几种修改方案,让结果仅打印一次:
方案一:仅在递归终止时打印
把printf语句放到base case的分支中,只有当n为0时才执行打印操作:
void printReverse(int n) { static int rev=0; //base case if(n) { int rem = n % 10; rev = rev*10 + rem; printReverse(n/10); } else { printf("%d ",rev); } }
方案二:让递归函数返回反转结果,在main中打印
这种方式让函数职责更清晰,递归只负责计算反转后的数字,打印逻辑交给main函数处理:
#include <stdio.h> #include <stdlib.h> //function declaration int reverseNumber(int); int main() { int n; printf("\n\t\t\t\t\tThis program prints reverse of a given number"); printf("\nEnter a number: "); scanf("%d",&n); //if someone enters 0 if(n==0) { printf("%d",n); return 0; } //计算反转后的数字并打印 int reversed = reverseNumber(n); printf("%d", reversed); return 0; } int reverseNumber(int n) { static int rev=0; //base case if(n) { int rem = n % 10; rev = rev*10 + rem; reverseNumber(n/10); } return rev; }
方案三:避免静态变量,用指针传递反转结果
静态变量会在函数多次调用时保留值,可能引发意外问题。可以用指针传递的方式来计算反转结果,同时保证函数无副作用:
#include <stdio.h> #include <stdlib.h> //function declaration void reverseHelper(int n, int *rev); int main() { int n; printf("\n\t\t\t\t\tThis program prints reverse of a given number"); printf("\nEnter a number: "); scanf("%d",&n); if(n==0) { printf("%d",n); return 0; } int rev = 0; reverseHelper(n, &rev); printf("%d", rev); return 0; } void reverseHelper(int n, int *rev) { if(n) { int rem = n % 10; *rev = (*rev)*10 + rem; reverseHelper(n/10, rev); } }
内容的提问来源于stack exchange,提问作者Aniket Tripathi
相关产品推荐
相关产品推荐

