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

如何仅传递一个参数实现递归字符串模式生成?

问题描述

我近期遇到一个递归字符串模式生成的难题,希望得到思路或提示。

模式规则如下:

  • 若参数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层()包裹

基于此,递归逻辑可简化为:

  1. 基准情况:
    • n=1时返回"*",n=2时返回"**"
  2. 递归步骤:
    • 无论n是奇数还是偶数,都返回"(" + myString(n-2) + ")"——相当于给长度为n-2的结果套一层括号,逐步缩小问题规模直到基准情况。

最终代码

#include <string>
using namespace std;

string myString(int n) {
    // 基准情况
    if (n == 1) {
        return "*";
    }
    if (n == 2) {
        return "**";
    }
    
    // 递归套括号
    return "(" + myString(n - 2) + ")";
}

内容的提问来源于stack exchange,提问作者Solidsnake1209

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:17:35