Python递归函数问题:实现仅接受2的幂整数的图案打印
修复你的递归图案打印函数
看起来你搞混了递归的分解方向,而且直接用print导致输出格式不对。让我们一步步解决这个问题:
问题分析
先拆解你给出的示例规律:
pattern(1)→1pattern(2)→112=pattern(1)+pattern(1)+2pattern(4)→1121124=pattern(2)+pattern(2)+4pattern(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
为什么这样改?
- 递归方向正确:因为输入是2的幂,每次递归分解为
n//2(比如n=4分解为2,n=2分解为1),完美匹配示例的规律。 - 用字符串拼接代替直接打印:返回字符串可以让我们把递归结果无缝拼接,最后通过一次
print输出连续内容,避免了换行和零散输出的问题。 - 输入验证:添加了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
相关产品推荐
相关产品推荐

