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

Python递归函数问题:实现仅接受2的幂整数的图案打印

修复你的递归图案打印函数

看起来你搞混了递归的分解方向,而且直接用print导致输出格式不对。让我们一步步解决这个问题:

问题分析

先拆解你给出的示例规律:

  • pattern(1) → 1
  • pattern(2) → 112 = pattern(1) + pattern(1) + 2
  • pattern(4) → 1121124 = pattern(2) + pattern(2) + 4
  • pattern(8) → 112112411211248 = pattern(4) + pattern(4) + 8

核心逻辑是:对于2的幂n,pattern(n)等于两次pattern(n/2)的结果拼接,再加上n本身的字符串形式。而你的代码用了n-1作为递归参数,完全不符合这个规律;另外直接用print会打断输出连续性(默认换行),无法拼接成需要的连续字符串。

修正后的代码

我们改成让函数返回字符串(而非直接打印),这样就能轻松拼接递归结果,最后统一输出:

def pattern(n):
    # 可选:验证输入是否是2的幂,符合题目要求
    if n != 1 and (n & (n - 1)) != 0:
        raise ValueError("n must be a power of 2")
    
    # 递归基例
    if n == 1:
        return "1"
    # 递归步骤:两次子问题结果 + 当前n的字符串
    sub_pattern = pattern(n // 2)
    return sub_pattern + sub_pattern + str(n)

# 调用示例
print(pattern(1))  # 输出: 1
print(pattern(2))  # 输出: 112
print(pattern(4))  # 输出: 1121124
print(pattern(8))  # 输出: 112112411211248

为什么这样改?

  1. 递归方向正确:因为输入是2的幂,每次递归分解为n//2(比如n=4分解为2,n=2分解为1),完美匹配示例的规律。
  2. 用字符串拼接代替直接打印:返回字符串可以让我们把递归结果无缝拼接,最后通过一次print输出连续内容,避免了换行和零散输出的问题。
  3. 输入验证:添加了2的幂的检查,确保函数只接受符合要求的输入,贴合题目描述。

如果你希望函数内部直接打印结果,也可以这样调整(不过更推荐返回字符串的方式,灵活性更高):

def pattern(n):
    if n != 1 and (n & (n - 1)) != 0:
        raise ValueError("n must be a power of 2")
    
    if n == 1:
        res = "1"
    else:
        sub = pattern(n // 2)
        res = sub + sub + str(n)
    
    print(res)
    return res

这样调用pattern(2)时会直接打印112,调用pattern(4)会先打印112再打印1121124,你可以根据需求选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:17:21