如何用C语言单个递归函数实现打印1到n再返回到1的序列
实现方案
完全可以仅用单个递归函数实现需求,核心利用递归调用「先递后归」的执行特性:进入下层递归前打印当前值实现递增序列,递归返回后再打印当前值实现递减序列即可。
推荐实现(无副作用,线程安全)
// 内部递归函数:max为目标最大值,cur为当前打印的数值 void printHelper(int max, int cur) { // 先打印当前数值 printf("%d", cur); // 到达最大值时终止递归,不再往下调用 if (cur == max) { return; } // 递归打印下一个更大的数 printHelper(max, cur + 1); // 递归返回后,再打印一次当前数值,实现递减序列 printf("%d", cur); } // 对外暴露的单参数调用接口 void printSequence(int n) { if (n < 1) { return; // 入参合法性校验 } printHelper(n, 1); }
执行逻辑说明(以n=5为例)
- 调用
printSequence(5)后进入printHelper(5,1),先打印1,未到最大值,调用printHelper(5,2) - 进入
printHelper(5,2),打印2,未到最大值,调用printHelper(5,3) - 进入
printHelper(5,3),打印3,未到最大值,调用printHelper(5,4) - 进入
printHelper(5,4),打印4,未到最大值,调用printHelper(5,5) - 进入
printHelper(5,5),打印5,到达最大值直接返回 - 回到
printHelper(5,4)的递归调用后逻辑,打印4 - 回到
printHelper(5,3)的递归调用后逻辑,打印3 - 回到
printHelper(5,2)的递归调用后逻辑,打印2 - 回到
printHelper(5,1)的递归调用后逻辑,打印1
最终输出结果为123454321,完全符合需求。
单参数递归实现(静态变量方案,注意副作用)
如果不想用辅助函数,也可以用静态变量记录当前打印值,但注意静态变量会在函数调用之间保留值,多次调用前需要手动重置:
void printSequence(int n) { static int cur = 1; printf("%d", cur); if (cur == n) { cur--; return; } cur++; printSequence(n); printf("%d", cur); cur--; }
内容的提问来源于stack exchange,提问作者HulkStoN
相关产品推荐
相关产品推荐

