如何仅传递一个参数实现递归字符串模式生成?
问题描述
我近期遇到一个递归字符串模式生成的难题,希望得到思路或提示。
模式规则如下:
- 若参数n为偶数,中心输出
**并被()包裹;若n为奇数,中心仅输出一个*并被()包裹。
我之前修改了myString函数让它接收两个参数,用其中一个作为追踪器保留原始n值,但题目要求只能传递一个参数,现在毫无头绪。
示例输出
myString(1)应输出"*"myString(2)应输出"**"myString(4)应输出"(**)"myString(9)应输出"((((*))))"
我的尝试代码
string myString(int n, int m) { string tempString; int middle = round(m / 2); if (m == 1) { return "*"; } else if (m == 2) { return "**"; } if (n > middle + 1) { tempString += '(' + myString(n - 1,m); } else if (n == middle + 1) { if (m % 2) { tempString += '*'; n -= 1; } else { tempString += "**"; n -= 2; } tempString += myString(n, m); } else if (n < middle + 1 && n > 0) { tempString += ')' + myString(n - 1, m); } return tempString; }
解决思路与实现
要实现单参数递归,核心是通过当前n值直接推导递归阶段,无需额外追踪原始n。观察示例可发现规律:
- 最终字符串的长度等于输入n
- 奇数n:中心是1个
*,左右各有(n-1)/2层()包裹 - 偶数n:中心是2个
*,左右各有(n-2)/2层()包裹
基于此,递归逻辑可简化为:
- 基准情况:
- n=1时返回
"*",n=2时返回"**"
- n=1时返回
- 递归步骤:
- 无论n是奇数还是偶数,都返回
"(" + myString(n-2) + ")"——相当于给长度为n-2的结果套一层括号,逐步缩小问题规模直到基准情况。
- 无论n是奇数还是偶数,都返回
最终代码
#include <string> using namespace std; string myString(int n) { // 基准情况 if (n == 1) { return "*"; } if (n == 2) { return "**"; } // 递归套括号 return "(" + myString(n - 2) + ")"; }
内容的提问来源于stack exchange,提问作者Solidsnake1209
相关产品推荐
相关产品推荐

