能否仅用单参数递归函数arrow(n)实现箭头图案输出?
当然可行!单参数递归完全能实现这个箭头图案,核心是利用递归的先递后归特性——先逐步打印递增的星号序列,再回溯打印递减的序列,整个过程不需要额外参数,靠递归调用栈本身就能追踪当前处理的层级。
思路与实现
核心逻辑
递归函数的执行分为三个阶段:
- 递推阶段:先调用自身处理
n-1,完成从1到n-1的星号组打印; - 当前层处理:打印
n个星号的组,用空格和前面的内容分隔; - 回溯阶段:再次调用自身处理
n-1,完成从n-1到1的星号组打印。
终止条件设为n=1,此时直接打印单个*即可,这是递归的最小单元。
Python代码示例
def arrow(n): if n == 1: print("*", end="") return # 递推:打印1到n-1的星号组 arrow(n-1) # 打印当前n个星号,前面加空格分隔 print(f" {'*'*n}", end="") # 回溯:打印n-1到1的星号组 arrow(n-1) # 测试调用 arrow(4) # 输出结果:* ** *** **** *** ** *
逻辑拆解
拿arrow(4)举例:
- 首先递归调用
arrow(3),arrow(3)又调用arrow(2),arrow(2)调用arrow(1); arrow(1)打印*后返回,arrow(2)接着打印**,再调用arrow(1)打印*,此时arrow(2)完成,输出* ** *;- 回到
arrow(3),打印***,再调用arrow(2)打印** *,此时arrow(3)完成,输出* ** *** ** *; - 回到
arrow(4),打印****,再调用arrow(3)打印*** ** *,最终拼接成完整的箭头图案。
其他语言示例(JavaScript)
如果用JavaScript实现,思路完全一致:
function arrow(n) { if (n === 1) { process.stdout.write("*"); return; } arrow(n-1); process.stdout.write(` ${'*'.repeat(n)}`); arrow(n-1); } arrow(4); // 输出:* ** *** **** *** ** *
内容的提问来源于stack exchange,提问作者Térence C
相关产品推荐
相关产品推荐

