
在编程实践中,有时我们需要以特定的顺序遍历并打印一个数字范围。一个常见的需求是,给定一个正整数 n,程序需要打印从 1 到 n 之间的所有整数,但顺序是交替从两端开始:先打印 1,然后打印 n,接着打印 2,然后打印 n-1,依此类推,直到所有数字都被打印。
例如,如果用户输入 5,期望的输出是:
1 5 2 4 3
初学者在尝试实现此功能时,常常会遇到一个问题:当 N 是奇数时,中间的数字可能会被重复打印。这通常是因为循环条件设置不当,导致用于追踪两端数字的变量在某个时刻重合,并被重复处理。
考虑以下一个常见的错误实现尝试:
num = int(input('Please type in a number:'))
index = 1
while index <= num:
print(index)
print(num)
index += 1
num -= 1这段代码的意图是好的,它尝试使用 index 从左端递增,num 从右端递减。然而,当 N 为奇数(例如 5)时,其执行过程如下:
立即学习“Python免费学习笔记(深入)”;
最终输出为:
1 5 2 4 3 3
可以看到,中间的 3 被打印了两次,这不符合要求。
为了避免上述问题,我们可以采用“双指针”方法,并结合精确的循环条件和中间值处理逻辑。核心思想是使用两个变量分别代表当前需要打印的左端和右端数字,并通过判断这两个变量的关系来决定打印方式和循环终止条件。
以下是一个更健壮的解决方案:
def print_alternating_numbers():
"""
接收用户输入一个正整数N,并交替打印1到N之间的数字。
例如,N=5时输出1, 5, 2, 4, 3。
"""
try:
num_input = int(input('Please type in a number:'))
if num_input <= 0:
print("请输入一个正整数。")
return
except ValueError:
print("无效输入,请输入一个整数。")
return
left_pointer = 1
right_pointer = num_input
while left_pointer <= right_pointer:
if left_pointer == right_pointer:
# 当left和right相遇时,说明是奇数N的中间元素,只打印一次
print(left_pointer)
break # 打印后即可退出循环
else:
# 正常情况下,打印左端和右端数字
print(left_pointer)
print(right_pointer)
# 移动指针
left_pointer += 1
right_pointer -= 1
# 调用函数执行程序
print_alternating_numbers()用户输入与校验:
初始化双指针:
循环条件:
内部逻辑(条件判断):
使用上述优化后的代码,我们来测试不同输入下的输出。
示例 1: N = 5 (奇数) 输入:5 输出:
1 5 2 4 3
解释:
示例 2: N = 6 (偶数) 输入:6 输出:
1 6 2 5 3 4
解释:
示例 3: N = 1 (边缘情况) 输入:1 输出:
1
解释:
示例 4: N = 2 (边缘情况) 输入:2 输出:
1 2
解释:
以上就是Python编程:实现区间两端交替打印数字的详细内容,更多请关注php中文网其它相关文章!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号