Python右金字塔形字符串打印的替代实现方法咨询
几种实现字符串右金字塔打印的方法
你的代码逻辑清晰,完全能实现需求,这里再给你几种不同思路的实现方法,帮你拓展Python的写法思路:
方法1:单循环覆盖所有行
通过计算每一行对应的子串长度,用一个循环完成所有行的打印,无需拆分递增和递减两个循环。
string = 'python' n = len(string) # 总共有 2*n -1 行 for i in range(2 * n - 1): # 计算当前行需要打印的子串长度:和中间行的距离越近,长度越长 current_length = n - abs(n - 1 - i) print(string[:current_length])
思路说明:中间最长的那行是第n-1个索引(从0开始),用abs(n-1 -i)算出当前行和中间行的距离,总长度n减去这个距离,就得到当前要打印的子串长度,一次循环就能搞定所有行。
方法2:递归实现
利用递归的“先递后归”特性,先打印递增的部分,再在递归返回时打印递减的部分。
def print_pyramid(s, current_len): if current_len <= len(s): # 先打印当前长度的子串 print(s[:current_len]) # 递归调用,长度+1,处理下一行 print_pyramid(s, current_len + 1) # 递归返回时,打印递减的部分(跳过最长的那行,避免重复) if current_len != len(s): print(s[:current_len]) string = 'python' print_pyramid(string, 1)
思路说明:递归函数先从长度1开始,逐步递推到最长长度n,打印所有递增行;当递推到最长长度后,开始回溯,依次打印长度n-1到1的子串,实现递减部分。
方法3:列表生成式预存所有行
先通过列表生成式把所有要打印的行都生成出来,再统一遍历打印,代码更简洁。
string = 'python' n = len(string) # 生成递增行:['p', 'py', ..., 'python'] increasing_lines = [string[:i+1] for i in range(n)] # 生成递减行:['pytho', 'pyth', ..., 'p'](跳过最长的行) decreasing_lines = [string[:n - i - 1] for i in range(n-1)] # 合并后打印所有行 for line in increasing_lines + decreasing_lines: print(line)
思路说明:用列表生成式分别生成递增和递减的行集合,合并后遍历打印,把“生成内容”和“打印”的逻辑分开,可读性更强。
方法4:调整递减循环的索引逻辑
和你的原代码思路类似,但调整递减部分的索引方式,让逻辑和递增部分更统一,更直观。
string = 'python' n = len(string) # 递增部分:从1到n长度的子串 for i in range(n): print(string[:i+1]) # 递减部分:从n-1到1长度的子串 for i in range(n-2, -1, -1): print(string[:i+1])
思路说明:原代码递减部分用string[:-(i+1)]取子串,这里直接用range(n-2, -1, -1)拿到从n-2到0的索引,每次取前i+1个字符,和递增部分的取法保持一致,更容易理解。
内容的提问来源于stack exchange,提问作者Pynewbie
相关产品推荐
相关产品推荐

