如何使用Ruby打印特定奇数边长的矩形图形
解决Ruby打印特定矩形的问题
首先,我们先拆解你给出的示例图案,梳理其中的规律:
先看n=5(奇数)的标准情况
- 总共有5行,每行5个字符
- 只有中间一行是全
*(带空格分隔) - 其他行都是首尾为
*,中间用=(带空格分隔)填充
通用实现代码(适配所有奇数n,遵循中间行全*规律)
这个版本可以完美适配任意奇数边长的矩形,逻辑清晰且通用:
def rectangle(n) # 先校验输入必须是奇数 raise ArgumentError, "参数n必须是奇数" unless n.odd? # 预定义两种行模式,避免重复拼接 # 模式A:首尾*,中间用=填充 pattern_a = "* " + ("= " * (n - 2)) + "*" # 模式B:整行全* pattern_b = ("* " * (n - 1)) + "*" # 计算中间行的索引(从0开始计数) middle_index = (n - 1) / 2 # 逐行输出对应模式 n.times do |i| puts i == middle_index ? pattern_b : pattern_a end end # 测试n=5 rectangle(5)
运行后输出完全匹配你的示例:
* = = = * * = = = * * * * * * * = = = * * = = = *
适配你给出的n=7特殊示例
你提供的n=7示例中,全*的行是第3、4、7行(从1开始计数),对应索引2、3、6(从0开始)。我们可以针对性调整条件来满足这个需求:
def rectangle(n) raise ArgumentError, "参数n必须是奇数" unless n.odd? pattern_a = "* " + ("= " * (n - 2)) + "*" pattern_b = ("* " * (n - 1)) + "*" n.times do |i| case n when 5 puts i == 2 ? pattern_b : pattern_a when 7 # 匹配你给出的n=7示例:索引2、3、6的行全* puts (i == 2 || i == 3 || i == 6) ? pattern_b : pattern_a else # 如果需要扩展到更大的奇数,补充这里的规律即可 # 比如可以按n=7的逻辑推导:mid_minus_1 = (n-1)/2 -1; mid = (n-1)/2; last_row = n-1 raise NotImplementedError, "请补充n=#{n}时的全*行规律" end end end # 测试n=7 rectangle(7)
运行后输出完全匹配你的n=7示例:
* = = = = = * * = = = = = * * * * * * * * * * * * * * * * = = = = = * * = = = = = * * * * * * * *
小说明
从你给出的两个示例来看,n=5和n=7的全*行规律没有明显的通用性。如果n=7的示例是笔误,建议采用**中间一行全***的通用逻辑,代码可以无缝适配所有奇数n;如果确实需要特定行是全*,补充统一规律后即可扩展条件判断。
内容的提问来源于stack exchange,提问作者spn
相关产品推荐
相关产品推荐

