鱼C论坛

 找回密码
 立即注册
查看: 1128|回复: 12

[已解决]关于课后作业006

[复制链接]
发表于 2018-4-23 17:44:54 | 显示全部楼层 |阅读模式

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

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

x
print(2 ** 2 ** 32)

# 一般很多机子都会在一会儿之后:Memory Overflow,内存不够用。
# 设计到幂操作,结果都是惊人滴。

我试着
print((2 ** 2) ** 32)
可以算出答案,感觉好像没区别啊?
为什么第一个会很卡?
最佳答案
2018-4-23 20:33:29
因为这完全是两种运算呀。咱不妨将32次幂变小一点,变成4次幂来试一下吧,对比print(2**2**4)和print((2**2)**4)的结果就知道了
>>> print(2**2**4)
65536
>>> print((2**2)**4)
256
可见print(2 ** 2 ** 32)并不是对(2**2)做32次幂,那么这到底是什么运算呢?我一个小白也不知道,只能试一哈,从小处开始:
>>> print(2**2**1)
4
>>> print(2**2**2)
16
>>> print(2**2**3)
256(在这里应该发现了,这是16的平方,也就是2的8次方,2**2**3是先算右侧!!!)
>>> print(2**2**4)
65536(这是2的16次方)
然后我去百度,知道了这么回事:
**是幂运算,优先级是右结合,a ** b即求a的b次方
右结合的意思是说多次幂运算先递归计算右边的结果: a ** b ** c = a ** ( b ** c)
这里2 ** 2 ** 3 = 2 ** (2 ** 3) = 2 ** 8 = 256
https://zhidao.baidu.com/question/691609587947341604.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-23 18:16:04 | 显示全部楼层
同想知道,应该涉及了数据结构之类的吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-23 19:32:42 | 显示全部楼层
>>> from dis import dis
>>> dis(pp1.f)
  2           0 LOAD_GLOBAL              0 (print)

===============================
确实是这样,导入也慢。想dis分析下竟然加载了半小时(!)。。还没好。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-23 20:20:08 | 显示全部楼层
对计算机来说,处理方式不同,无论什么样的算式,计算机总能分解为 + - * /。前者耗费的系统资源多得多

(2 ** 2 ** 32) 相当于 2*2*2*2...*2

(2**2)**32 相当于 4*4*4...*4
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-23 20:33:29 | 显示全部楼层    本楼为最佳答案   
因为这完全是两种运算呀。咱不妨将32次幂变小一点,变成4次幂来试一下吧,对比print(2**2**4)和print((2**2)**4)的结果就知道了
>>> print(2**2**4)
65536
>>> print((2**2)**4)
256
可见print(2 ** 2 ** 32)并不是对(2**2)做32次幂,那么这到底是什么运算呢?我一个小白也不知道,只能试一哈,从小处开始:
>>> print(2**2**1)
4
>>> print(2**2**2)
16
>>> print(2**2**3)
256(在这里应该发现了,这是16的平方,也就是2的8次方,2**2**3是先算右侧!!!)
>>> print(2**2**4)
65536(这是2的16次方)
然后我去百度,知道了这么回事:
**是幂运算,优先级是右结合,a ** b即求a的b次方
右结合的意思是说多次幂运算先递归计算右边的结果: a ** b ** c = a ** ( b ** c)
这里2 ** 2 ** 3 = 2 ** (2 ** 3) = 2 ** 8 = 256
https://zhidao.baidu.com/question/691609587947341604.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2018-4-23 20:36:42 | 显示全部楼层
本帖最后由 zkgxx 于 2018-4-23 20:39 编辑
thexiosi 发表于 2018-4-23 20:20
对计算机来说,处理方式不同,无论什么样的算式,计算机总能分解为 + - * /。前者耗费的系统资源多得多

...


你这里应该说明一点2**2**32是2的32次方(也就是4294967296)个2相乘,而不是32个(2**2)相乘。因为2**2**32=2**(2**32)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-23 21:03:49 | 显示全部楼层
zkgxx 发表于 2018-4-23 20:33
因为这完全是两种运算呀。咱不妨将32次幂变小一点,变成4次幂来试一下吧,对比print(2**2**4)和print((2**2 ...

恍然大悟!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-23 21:33:58 | 显示全部楼层
zkgxx 发表于 2018-4-23 20:33
因为这完全是两种运算呀。咱不妨将32次幂变小一点,变成4次幂来试一下吧,对比print(2**2**4)和print((2**2 ...

说的非常好 :)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-23 22:55:17 | 显示全部楼层
whx2008 发表于 2018-4-23 22:07
用print(2 ** 2 ** 32)的时候几秒后都未响应,用print((2 ** 2)** 32)的时候很快就能算出来,你们是如 ...

Python的幂运算是从右边结合的。
正如楼上所言:
=============
>>> (2**2**4)
65536
>>> (2**2)**4
256
>>> 2**2**4
65536
>>>
============
2**2**4实际上等价于2**(2**4)。
总结:实践出真知啊!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-24 07:58:30 | 显示全部楼层
ABC23 发表于 2018-4-23 19:32
>>> from dis import dis
>>> dis(pp1.f)
  2           0 LOAD_GLOBAL              0 (print)

我那道课后题的答案填的是:no zuo no die why you try
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-24 08:01:31 | 显示全部楼层
thexiosi 发表于 2018-4-23 20:20
对计算机来说,处理方式不同,无论什么样的算式,计算机总能分解为 + - * /。前者耗费的系统资源多得多

...

不是吧,根据从左到右原则,第一个应该也是先计算2 ** 2=4再是4的32次方吧,跟你下面的一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-24 08:04:35 | 显示全部楼层
zkgxx 发表于 2018-4-23 20:33
因为这完全是两种运算呀。咱不妨将32次幂变小一点,变成4次幂来试一下吧,对比print(2**2**4)和print((2**2 ...

谢谢,很详细,更好的介绍了应对此类问题的方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-24 08:27:55 | 显示全部楼层
livermore1877 发表于 2018-4-24 08:01
不是吧,根据从左到右原则,第一个应该也是先计算2 ** 2=4再是4的32次方吧,跟你下面的一样

嗯 我说的不准确,最佳答案是正解 :)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 07:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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