由“输出从1到1000的数”想到的

本文探讨了在C/C++中不使用循环、条件判断或重复输出的限制条件下,通过递归实现从1到1000的数字打印。文章详细介绍了三种递归方法,包括修改除法操作防止程序崩溃、宏实现和利用main函数进行递归调用,最终解释了程序参数初始化的重要性。

酷壳看到一个编程题目——请把从1到1000的数打印出来,不能使用任何的循环语句或条件判断语句,更不能写1000个printf和cout,用C/C++语言。

最容易想到的是用递归,文中给出了一个例子:

#include <stdio.h> void f(int n) { printf("%d/n",n); n/(1000-n); f(n+1); } void main() { f(1); }

该程序的本意是在n==1000时,n/(1000-n)的分母为0,使程序崩溃,从而结束递归。

不过用gcc编译执行时,并没有出现崩溃,而是一直输出。

只有将分母为0的除式赋值给一个变量时,程序才会崩溃,更改如下:

#include <stdio.h> int tmp=0; void f(int n) { printf("%d/n",n); tmp=n/(1000-n); f(n+1); } void main() { f(1); }

还有一个用宏实现的方法,不得不感叹宏的强大:

#include<stdio.h> #define Out(i) printf("%d/n", i++); #define REP(N) N N N N N N N N N N #define Out1000(i) REP(REP(REP(Out(i)))) void main() { int i = 1; Out1000(i); }

最后与一个很BT的:

void main(int j) { printf("%d/n", j); (main + (exit - main)*(j/1000))(j+1); }

这也是一个递归,利用main函数作为递归函数,

当j<1000时,j/1000为0,因为j是int型,所以执行:

(main+(exit-main)*0)(j+1);

也就是

main(j+1);

当j=1000时,j/1000为1,执行:

(main+(exit-main)*1)(1000+1);

main和exit都是函数名,即函数在内存中的地址,是可以做加减运算的,所以这时执行:

exit(1000+1);

程序退出,结束递归。

为什么j的初始值为1呢?

因为带参数的main函数的原型是:

main(int argc, char **agrv);

这里省略了第二个参数,j就是argc,程序执行是不带参数,j就是1。

所以,该程序要想真正执行,是不能带参数的。

受益匪浅!!!

<think>嗯,用户问的是如何用list输出110。首先,我需要确定用户的需求是什么。可能他们刚学Python,想了解如何生成一个包含110的列表。 接下来,我应该考虑不同的方法。最直接的方式是手动列出所有元素,比如[1,2,3,...,10],不过对于较大的范围来说,这样写太麻烦,也不高效。这时候,应该想到使用range函,因为range可以生成一个整序列,然后用list转换。 用户可能对range函不太熟悉,特别是Python 3中range和Python 2的区别。需要说明range的参,比如start、stop、step,这里stop是11,因为range是左闭右开的。例如,range(1,11)生成110的。 另外,还可以考虑列表推导式,虽然对于简单的110来说可能有点多余,但这也是一个方法。或者使用循环append,不过这种方法比较繁琐,但有助于理解列表的构建过程。 还要注意可能的误区,比如用户可能误用range的参,比如写成range(1,10),这样只会得到1到9,需要提醒他们注意stop的值。此外,是否包括10也是一个关键点,需要明确说明。 用户可能的问题还包括如何处理更大的范围,或者不同的步长,但当前问题只需要110,所以保持解答简洁。需要比较不同方法的优缺点,比如手动输入适合小列表,而range更高效适合大范围。 最后,确保代码示例正确,比如list(range(1,11)),并解释每个参的作用。这样用户不仅知道怎么做,还能理解背后的原理,避免以后出现类似的错误。</think>### 一、核心方法 在Python中,用列表输出110的最直接方法是 **使用`range()`函** 配合`list()`转换: ```python numbers = list(range(1, 11)) # 生成110的整序列 print(numbers) # 输出:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ``` --- ### 二、原理详解 #### 1. `range()`函的作用 - `range(start, stop, step)` 生成一个左闭右开的整序列: - `start`:起始值(默认为0) - `stop`:结束值(**不包含该值**) - `step`:步长(默认为1) - **关键细节**:`range(1, 11)` 实际生成110的序列 #### 2. `list()`函的功能 将可迭代对象(如`range`生成的序列)转换为列表 --- ### 三、其他实现方式 #### 方法1:手动创建列表(适合少量元素) ```python numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ``` #### 方法2:列表推导式 ```python numbers = [x for x in range(1, 11)] ``` #### 方法3:循环追加(理解列表动态构建) ```python numbers = [] for i in range(1, 11): numbers.append(i) ``` --- ### 四、常见误区 #### 错误示例1:`range`参错误 ```python list(range(1, 10)) # 错误!输出[1,2,...,9] ``` **修正**:应使用`range(1, 11)` #### 错误示例2:混淆生成器与列表 ```python r = range(1, 11) # 直接打印r不会显示具体字 print(r) # 输出:range(1, 11) ``` **修正**:必须用`list()`转换 --- ### 五、扩展应用 #### 生成特定规律的列 | 需求 | 代码示例 | 输出结果 | |---------------|-----------------------------|-------------------------| | 110的偶 | `list(range(2, 11, 2))` | `[2,4,6,8,10]` | | 10到1倒序 | `list(range(10, 0, -1))` | `[10,9,8,...,1]` | | 110的平方 | `[x**2 for x in range(1,11)]` | `[1,4,9,16,...,100]` | --- ### 六、性能建议 - **优先使用`range()`**:比手动输入或循环追加更高效 - **避免过早优化**:对于小范围(如1-1000)无需担心内存问题 - **超大范围慎用**:`range(1, 10**6)`本身不占内存,但转换为列表会一次性加载所有元素 --- ### 七、总结 - **标准方案**:`list(range(1, 11))` - **核心原理**:利用`range`生成序列,`list`转换存储 - **扩展思维**:掌握`range`的参规律可快速生成各类值序列
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值