鱼C论坛

 找回密码
 立即注册
查看: 139|回复: 5

[已解决]Python这样线程执行线程的方式算不算递归啊?

[复制链接]
发表于 2025-3-16 19:20:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
rt.
from threading import Timer
def func():
    print('called')
    Timer(1,func).start()
func()
while True:
    pass

(顺便问问它的时间复杂度? $O(n)$ 还是 $O(n^n)$? )

我的想法:Thread#1使Thread#2运行,#2使#3运行,所以这是递归咯?

但是Thread.start也可以看作是往线程列表里增加了一项,各个Thread都在线程列表里,并列?

js也有settimeout类似的写法,js又是不是呢?
最佳答案
2025-3-16 19:27:51
player-none 发表于 2025-03-16 19:27
FishC 发表于 2025-3-16 19:23
在你的假设下,即程序 ...


### **关于 `while True: pass` 的时间复杂度**  

`while True: pass` 是一个无限循环,它不会执行任何有意义的计算,只是不断地检查条件并执行 `pass` 语句。  

- **时间复杂度**:理论上是 **$O(∞)$**,因为它永远不会终止。  
- **如果运行 $t$ 秒后停止**,那么它的时间复杂度是 **$O(t)$**,因为它每秒执行相同的操作,执行时间与 $t$ 成正比。  

### **关于空间复杂度**  
- `while True: pass` **不会分配额外的内存**,因此空间复杂度可以认为是 **$O(1)$**,而不是 **$O(0)$**(通常不使用 $O(0)$,因为即使是最小的程序也会占用一些内存)。  

### **关于线程的情况**  
- 你的 `Timer` 代码每秒创建一个新线程,因此 $t$ 秒后有 $O(t)$ 个线程。  
- 但 `while True: pass` 只有一个主线程在运行,因此线程数始终是 **$O(1)$**。  

### **总结**  
| 代码 | 时间复杂度 | 空间复杂度 | 线程数 |  
|------|----------|----------|------|  
| `while True: pass` | $O(t)$ | $O(1)$ | $O(1)$ |  
| `Timer(1, func).start()` | $O(t)$ | $O(t)$ | $O(t)$ |  

所以,`while True: pass` 的时间复杂度是 **$O(t)$**,空间复杂度是 **$O(1)$**,线程数也是 **$O(1)$**。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2025-3-16 19:20:27 | 显示全部楼层
从概念上来说,你的代码并不算严格意义上的递归。递归通常指的是一个函数在其执行过程中直接或间接调用自身,而这里的 `func()` 并没有在执行过程中调用自己,而是通过 `Timer(1, func).start()` 让另一个线程在 1 秒后执行 `func()`,这更像是 **事件驱动** 或 **异步调度**,而不是传统的递归调用。

### **关于时间复杂度**
你的代码的时间复杂度并不是 $O(n)$ 或 $O(n^n)$,而是 **$O(∞)$**,因为它是一个无限循环的定时任务,每秒都会创建一个新的线程并执行 `func()`,理论上会一直运行下去,直到程序被终止。

如果考虑 `n` 秒后的线程数量:
- 每秒创建一个新线程,`n` 秒后大约有 `n` 个线程在运行(假设没有其他限制)。
- 线程的创建是线性的,因此时间复杂度可以认为是 **$O(n)$**。

但需要注意的是,这种方式会导致线程无限增长,最终可能会耗尽系统资源,导致程序崩溃。

### **JS 的 `setTimeout`**
在 JavaScript 中,`setTimeout(func, 1000)` 也会在 1 秒后执行 `func()`,但它不会创建新的线程,而是利用 **事件循环** 机制,在 1 秒后将 `func()` 放入任务队列中等待执行。因此,JS 的 `setTimeout` 方式更像是 **异步回调**,而不是递归。

### **总结**
- 你的 Python 代码 **不是递归**,而是 **异步调度**。
- 其时间复杂度是 **$O(n)$**,但会导致线程无限增长,最终崩溃。
- JavaScript 的 `setTimeout` 也不是递归,而是基于 **事件循环** 的异步回调。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-3-16 19:23:09 | 显示全部楼层
FishC 发表于 2025-3-16 19:20
从概念上来说,你的代码并不算严格意义上的递归。递归通常指的是一个函数在其执行过程中直接或间接调用自身 ...

你的说法有误. 在Thread#1调用完Timer(...).start()之后,Thread#1的使命就完成了,系统并不会崩溃。
接下来我们假设在程序执行秒数$t=10$的时候,线程自动停止,while True 也停了,这样的话时间复杂度又是多少呢?$O(n)$,$O(n^n)$?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-3-16 19:23:17 | 显示全部楼层
player-none 发表于 2025-03-16 19:23
FishC 发表于 2025-3-16 19:20
从概念上来说,你的代 ...


在你的假设下,即程序在 $t=10$ 秒时停止,我们来分析时间复杂度。  

### **线程增长情况**
- 每秒创建一个新线程,因此在 $t=10$ 时,总共创建了 **10 个线程**。
- 这些线程是 **线性增长** 的,每秒只增加一个新线程。

### **时间复杂度分析**
- 线程的创建是 **线性的**,即 $t$ 秒后有 $O(t)$ 个线程。
- 每个线程的 `func()` 只执行一次,并不会嵌套调用自身,因此 **不会形成指数级增长**。
- 综上,时间复杂度是 **$O(n)$**,其中 $n$ 代表程序运行的秒数。

### **错误纠正**
你说得对,**系统不会崩溃**,因为 `Thread#1` 只是启动了 `Thread#2`,然后自己结束,后续线程也是如此。因此,线程数量不会无限增长,而是始终保持在 $O(n)$ 级别。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-3-16 19:27:37 | 显示全部楼层
FishC 发表于 2025-3-16 19:23
在你的假设下,即程序在 $t=10$ 秒时停止,我们来分析时间复杂度。  

### **线程增长情况**

既然$t$秒后有$O(t)$个线程,那如果只是
while True:pass
什么都不做,时间复杂度又是多少?

什么操作都没有,空间应该是$O(0)$(疑问:有这种写法吗?),时间又是多少?

线程每次都是一个,那$O(1)$ 也说得通吧?更何况这一秒的#1启动#2后,那$<1$秒的空隙似乎什么也没有啊?空间复杂度多少?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-3-16 19:27:51 | 显示全部楼层    本楼为最佳答案   
player-none 发表于 2025-03-16 19:27
FishC 发表于 2025-3-16 19:23
在你的假设下,即程序 ...


### **关于 `while True: pass` 的时间复杂度**  

`while True: pass` 是一个无限循环,它不会执行任何有意义的计算,只是不断地检查条件并执行 `pass` 语句。  

- **时间复杂度**:理论上是 **$O(∞)$**,因为它永远不会终止。  
- **如果运行 $t$ 秒后停止**,那么它的时间复杂度是 **$O(t)$**,因为它每秒执行相同的操作,执行时间与 $t$ 成正比。  

### **关于空间复杂度**  
- `while True: pass` **不会分配额外的内存**,因此空间复杂度可以认为是 **$O(1)$**,而不是 **$O(0)$**(通常不使用 $O(0)$,因为即使是最小的程序也会占用一些内存)。  

### **关于线程的情况**  
- 你的 `Timer` 代码每秒创建一个新线程,因此 $t$ 秒后有 $O(t)$ 个线程。  
- 但 `while True: pass` 只有一个主线程在运行,因此线程数始终是 **$O(1)$**。  

### **总结**  
| 代码 | 时间复杂度 | 空间复杂度 | 线程数 |  
|------|----------|----------|------|  
| `while True: pass` | $O(t)$ | $O(1)$ | $O(1)$ |  
| `Timer(1, func).start()` | $O(t)$ | $O(t)$ | $O(t)$ |  

所以,`while True: pass` 的时间复杂度是 **$O(t)$**,空间复杂度是 **$O(1)$**,线程数也是 **$O(1)$**。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-3 04:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表