鱼C论坛

 找回密码
 立即注册
查看: 1830|回复: 13

[已解决]关于求阶乘的代码,我这个错在哪里呢

[复制链接]
发表于 2018-5-26 11:44:59 | 显示全部楼层 |阅读模式

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

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

x
阶乘.png
上面是小甲鱼视频中的代码,5的阶乘是120,下面是我自己的,怎么总是不对,得到20??不明白为什么一来先result=n,最后还返回result,那岂不是返回的n了?
我理解的是返回n*(n-1)*(n-2)*.....*1  也就是返回下图我自己写的n*i啊,为什么不对呢?
最佳答案
2018-5-27 10:47:00
leftjay 发表于 2018-5-26 18:03
恩恩,看明白了,但是为什么上面那个代码就可以实现,我没明白为何一来就先result=n, 最后return result ...

  1. 假设n=5
  2. 原始 : result = 5
  3. i=1 : result = 5 * 1
  4. i=2 : result = 5 * 1 * 2
  5. i=3 : result = 5 * 1 * 2 * 3
  6. i=4 : result = 5 * 1 * 2 * 3 * 4 = 120
  7. return result = return 120
复制代码


楼主可能在学Python前没怎么接触过计算机知识?个人有三种不成熟的建议:
1.不要纠结原理,先学会该怎么用,随着知识的积累这些自然就懂了。
2.找本计算机基础的书大概看看,然后继续Python。
3.弄本C语言的教程,不用深学,看完后再学Python。

其实我觉得,既然选择了Python,就不该纠结原理,因为Python的简单就在于很多原理性问题不需要编程者实现。

result=n

直接在for循环里写'a=n*i'的写法在很多编程语言里根本就是语法错误,它属于无中生有,比如C。C里面,在使用a之前必须对a进行声明,也可以说是初始化;Python里简化了声明的过程,只要使用a的时候对它赋值就可以了,但也得有赋值之后才可以使用。你这代码里肯定会运行每一行,看不出这种错误;你试试下面的代码:
  1. def factorial(n):
  2.     if n != 2:
  3.         for i in range(1,n):
  4.             a = n * i
  5.     return a
  6.    
  7. factorial(2)
复制代码

根本就不能运行。所以即使在Python里也要养成初始化的好习惯,尤其是那些出现在if、for、while里的变量。

result=result*i
这可不是外部函数。这段代码从头到尾只有一个result变量,每一次计算都会改变result。

print(i)
这是把每一个i都输出了。你试试让'a=i',然后'print(a)',也会从0到4打印,但是for循环结束后,你得到的只是等于4的a,根本不会有等于0、1、2、3的a。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-26 11:52:46 | 显示全部楼层
你算法问题,本来到最后就是5*4
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-26 11:59:02 | 显示全部楼层
代码里的a从头到尾就没叠加过,不管你n是多少,它都只会返回n*(n-1)。

这种情况我一般都是自己人工把代码走一遍,代码量大的时候就IDE走。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-26 12:14:45 | 显示全部楼层
你的代码他只进行最后的 5*4  你试试理解我刚才写的
def fcut(n):
        q = 1
        for i in range(1,n):
                q =q * i
        s = n * q
        print(s)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-26 14:03:27 | 显示全部楼层
elang696 发表于 2018-5-26 11:59
代码里的a从头到尾就没叠加过,不管你n是多少,它都只会返回n*(n-1)。

这种情况我一般都是自己人工把代 ...

i不就是迭代了吗,为什么a从头到尾没叠加过?只会返回n*(n-1),那又为什么不是返回n*(n-2)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-26 14:07:29 | 显示全部楼层
旅行, 发表于 2018-5-26 12:14
你的代码他只进行最后的 5*4  你试试理解我刚才写的
def fcut(n):
        q = 1

为什么是取5*4,不是5*3或者5*2呢,哪里看出是n*(n-1)啊?i取的是1,2,3,4的嘛,为什么程序只默认i=4呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-26 14:31:32 | 显示全部楼层
你的程序是,当n=5,i依次是1,2,3,4,当n=4,时,a=5*(n=4)=20;
而上面的程序,n=5,首先result=5,i=1,2,3,4, result=reslult*i,resluilt没事都在变。你写的n是不会变得
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-26 14:34:25 | 显示全部楼层
本帖最后由 elang696 于 2018-5-26 14:48 编辑
leftjay 发表于 2018-5-26 14:03
i不就是迭代了吗,为什么a从头到尾没叠加过?只会返回n*(n-1),那又为什么不是返回n*(n-2)


你还没理解 ‘=’ 和 ‘*=’ 的意思。

for循环中,i从1到n-1递增,每次都会执行a=n*i,这次执行会让a变成新的n*i,而不是新的n*i加上旧的a;for循环完全结束后才会执行一次return,这时的a=n*(n-1),因为n不变,i最大只能到n-1。

你的代码并不是只进行最后的5*4,从5*1到5*4都执行了,只是前面的都覆盖掉了。

你的代码:假设 a 是一张白纸的左上角,第一次你在 a 上贴了一个数字 5,之后你得到一个10,但是没挪位置也没和 5 做任何交互,直接把 10 贴在了 a 上,现在 a 上显示多少?

你的想法:假设 a 是你的钱包,你往里面塞了 5 块钱,然后又塞了 10 块钱,这时钱包里有 15 块钱。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-26 18:03:00 | 显示全部楼层
elang696 发表于 2018-5-26 14:34
你还没理解 ‘=’ 和 ‘*=’ 的意思。

for循环中,i从1到n-1递增,每次都会执行a=n*i,这次执行会让 ...

恩恩,看明白了,但是为什么上面那个代码就可以实现,我没明白为何一来就先result=n, 最后return result,不就是return的n? result=result*i就把result这个变量改变了,怎么没报错(外部函数先定义了result=n啊)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-26 19:59:12 | 显示全部楼层
elang696 发表于 2018-5-26 14:34
你还没理解 ‘=’ 和 ‘*=’ 的意思。

for循环中,i从1到n-1递增,每次都会执行a=n*i,这次执行会让 ...

for i in range(5):
        print(i)

       
0
1
2
3
4
那这里为什么只打印4?0/1/2/3也一起打印出来了,并没有被覆盖啊,和我之前那个例子一样的啊,为什么那个会被覆盖啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-27 10:47:00 | 显示全部楼层    本楼为最佳答案   
leftjay 发表于 2018-5-26 18:03
恩恩,看明白了,但是为什么上面那个代码就可以实现,我没明白为何一来就先result=n, 最后return result ...

  1. 假设n=5
  2. 原始 : result = 5
  3. i=1 : result = 5 * 1
  4. i=2 : result = 5 * 1 * 2
  5. i=3 : result = 5 * 1 * 2 * 3
  6. i=4 : result = 5 * 1 * 2 * 3 * 4 = 120
  7. return result = return 120
复制代码


楼主可能在学Python前没怎么接触过计算机知识?个人有三种不成熟的建议:
1.不要纠结原理,先学会该怎么用,随着知识的积累这些自然就懂了。
2.找本计算机基础的书大概看看,然后继续Python。
3.弄本C语言的教程,不用深学,看完后再学Python。

其实我觉得,既然选择了Python,就不该纠结原理,因为Python的简单就在于很多原理性问题不需要编程者实现。

result=n

直接在for循环里写'a=n*i'的写法在很多编程语言里根本就是语法错误,它属于无中生有,比如C。C里面,在使用a之前必须对a进行声明,也可以说是初始化;Python里简化了声明的过程,只要使用a的时候对它赋值就可以了,但也得有赋值之后才可以使用。你这代码里肯定会运行每一行,看不出这种错误;你试试下面的代码:
  1. def factorial(n):
  2.     if n != 2:
  3.         for i in range(1,n):
  4.             a = n * i
  5.     return a
  6.    
  7. factorial(2)
复制代码

根本就不能运行。所以即使在Python里也要养成初始化的好习惯,尤其是那些出现在if、for、while里的变量。

result=result*i
这可不是外部函数。这段代码从头到尾只有一个result变量,每一次计算都会改变result。

print(i)
这是把每一个i都输出了。你试试让'a=i',然后'print(a)',也会从0到4打印,但是for循环结束后,你得到的只是等于4的a,根本不会有等于0、1、2、3的a。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-27 12:09:23 | 显示全部楼层
elang696 发表于 2018-5-27 10:47
楼主可能在学Python前没怎么接触过计算机知识?个人有三种不成熟的建议:
1.不要纠结原理,先学会 ...

是的,没有接触过计算机知识,更别说C语言,本来准备当地报个C语言的培训班,但是告诉我脱产全日制学习都要4个多月。。。我没有那么多时间,8月要去英国读研转专业学data science,这才先自学起Python,怕等去了跟不上
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-27 13:08:05 | 显示全部楼层
leftjay 发表于 2018-5-27 12:09
是的,没有接触过计算机知识,更别说C语言,本来准备当地报个C语言的培训班,但是告诉我脱产全日制学习都 ...

祝成功
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-28 08:56:01 | 显示全部楼层
旅行, 发表于 2018-5-26 12:14
你的代码他只进行最后的 5*4  你试试理解我刚才写的
def fcut(n):
        q = 1

请问下1赋值给了q,在后面的代码中,哪个地方会把q=1这个数值直接引用呢,最后一步S那里吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 22:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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