阶乘的迭代

我坚持不懈地试图编写一个生成一个阶乘的函数
使用迭代而不是递归的数字.任何简单的想法都是
感谢.

# 回答1


py-fun写道:
向我们展示您的尝试,我们可能会建议您解决问题.因为否则
听起来像功课一样可疑.
diez
# 回答2


10月22日,13:28," Diez B. Roggisch" 向我们展示您的尝试,我们可能会建议您解决问题.因为否则
听起来像功课一样可疑.
迪兹
这是我徒劳的尝试.虽然要小心,我只是跑了
类似的东西,它永远不会结束...
def itforfact(n):
而n <100:
打印n
n+1
n =输入("请输入低于100的数字")
itforfact(n)
# 回答3


py-fun写道:
与什么相反,一个复杂的人?
# 回答4


py-fun写道:
您的功能可能应该返回一些东西.之后,您可以看到
您获得的结果会发生什么.
# 回答5


py-fun 此版本避免做任何比添加1更典型的事情,所以应该是
对于任何人来说都足够简单:
def阶乘(e):
a = 1
对于范围(e)的b:
C = 0
对于J中的J(B,-1,-1):
对于D范围(a):
C += 1
a = c
返回A
# 回答6


10月22日,13:43,Marco Mariani 您的功能可能应该返回一些东西.之后,您可以看到
您获得的结果会发生什么.
马可,感谢您的提示.现在有效:
def itforfact(n):
而n <100:
打印n
n = n+1
n =输入("请输入低于100的数字")
itforfact(n)
不过是"阶乘"吗?
# 回答7


10月22日,下午2:43,Marco Mariani 您的功能可能应该返回一些东西.之后,您可以看到
您获得的结果会发生什么.
lambda n:n <= 0或降低(lambda a,b:long(a)*long(b),xrange(1,n+1))(_@@_)
在10/22/07,py-fun 向我们展示您的尝试,我们可能会建议您解决问题.因为否则
听起来像功课一样可疑.
迪兹

这是我徒劳的尝试.虽然要小心,我只是跑了
类似的东西,它永远不会结束...
def itforfact(n):
而n <100:
打印n
n+1
n =输入("请输入低于100的数字")
itforfact(n)
让我给你一个伪代码(尽管可以在大多数中找到
教科书和一些"简单"的谷歌搜索).尝试理解代码
然后编写等效的python函数.
函数ifactorial(n:integer):整数;
var i,temp:整数;
开始
温度= 1;
对于i = 1到n
温度= temp * i
结尾
返回温度
关于您的代码.
1.如果您发布的代码进入,为什么不让您感到惊讶
无限循环 ?!
2.为什么使用条件:n <100
3.您认为您的功能如何计算阶乘?
4.而不是"输入"使用" RAW_INPUT",然后将输入作为整数.
干杯,
阿米特.
- -
- -
Amit Khemka

# 回答8


10月22日,下午5:43,Marco Mariani 您的功能可能应该返回一些东西.之后,您可以看到
您获得的结果会发生什么.

我只是建议你一个主意
但是我不知道它可以满足您的需求
x = 10
def cal_range(10)
对于我在范围(10)中:
打印2 ** i

# 回答9


10月22日,下午1:26,py-fun 以下简单的加法功能应该使您了解如何
递归可以作为迭代重新铸造:
def acc(i):
``我应该成为一个积极的整数''''
如果我0:
返回i + acc(i -1)
返回0
打印" ACC",ACC(9)
def itt(i):
``我应该成为一个积极的整数''''
out = 0
当我0:
out += i
i = i -1
返回
打印" itt",itt(9)
呃没有.我都不是.您可能需要Google以获取定义
句子!这是一个提示:
降低(操作员.mul,范围(1,i + 1))
- -
安东尼·罗伊
# 回答10


这次是从食谱中.
它很好地满足了要求;)http://aspn.activestate.com/aspn/coo.../recipe/496691
def tail_recursion(g):
'''
tail_recursion装饰器的版本不使用堆栈框架
检查.
'''
loc_vars = {" in_loop":false," cnt":0}
def结果(*args,** kwd):
loc_vars [" cnt"]+= 1
如果不是loc_vars [" in_loop"]:
loc_vars [" in_loop"] = true
而1:
tc = g(*args,** kwd)
尝试:
Qual,Args,KWD = TC
如果Qual =='继续':
继续
除(typeError,valueerror):
loc_vars [" in_loop"] = false
返回TC
别的:
如果loc_vars [" cnt"]%2 == 0:
返回('conline',args,kwd)
别的:
返回g(*args,** kwd)
返回结果
@Tail_Recursion
def阶乘(n,acc = 1):
"计算阶乘"
如果n == 0:
返回ACC
res =阶乘(n-1,n*acc)
返回res
# 回答11


Marco Mariani写道:
[...对OP问题的最终通用答案.
我真的希望那是眨眼,马可.可怜的家伙
只是想完成他的作业!
:>
tjg
# 回答12


蒂姆·戈登(Tim Golden)写道:
[...对OP问题的最终通用答案.
我真的希望那是眨眼,马可.
眨眼是我帖子的第二行...更多的是"最少
满足要求的工作量
我看不出我的答案比基于基于的答案更糟
兰姆达.也许我只是嫉妒,因为当我年龄我不能
Google以获取答案.他至少应该能够做到这一点,不是吗?
可是等等.那将意味着了解什么是阶乘.那会
需要第二次搜索,或一本教科书或对
在编程之前,有或没有递归,算术.我们应该吗
怪老师?
# 回答13


10月22日,上午8:26,py-fun def fac_btt(num):
总计= 1
如果num 1:
对于范围(1,num+1)的i
总计 *= i
返回总数
# 回答14


10月22日,上午8:02,Vimal 我只是建议你一个主意
但是我不知道它可以满足您的需求
x = 10
def cal_range(10)
对于我在范围(10)中:
打印2 **我
也许一点数学刷新会很好 r试图发布的人
建议.
" n阶乘"的意思是" 1 x 2 x 3 x ... x n的产物",是
象征性地显示为" N!".
(阶乘仅针对非负数和原因而定义
这超出了这个小笔记,只知道0! = 1)
在Python中,值> = 1的完全扩展的阶乘将是:
2! = 1 * 2
5! = 1 * 2 * 3 * 4 * 5
8! = 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8
这是显示迭代的例程,打印这些
表达式:
def print_factorial(n):
打印str(n)+"!=",
打印" 1",
t = 2
而t <= n:
打印"*",t,
T += 1
打印
也许这个示例会给您一些有关如何处理您的想法
问题.
- 保罗
# 回答15


Marco Mariani写道:
[...对OP的问题的终极通用答案...我真的希望那是眨眼,Marco.

眨眼是我帖子的第二行...
我确实看到了:)
我看不出我的答案比基于基于的答案更糟
兰姆达.
我也没有.我只是和一个同事开玩笑
只是想要一点帮助(他确实得到了,实际上是从中得到的
几个消息来源)然后出来了兰伯达和
装饰师.仅仅段落前的片刻,
扭曲的解决方案出现了. :)
(就像看LISP程序员的约定一样 -
鸭子,奔跑)
tjg

# 回答16


10月22日,上午7:50,邓肯·布斯(Duncan Booth) 此版本避免做任何比添加1更典型的事情,所以应该是
对于任何人来说都足够简单:
def阶乘(e):
a = 1
对于范围(e)的b:
C = 0
对于J中的J(B,-1,-1):
对于D范围(a):
C += 1
a = c
返回
我的口味不太简单:
MPZ(3628800)
# 回答17


" me heyphderydeyde@aol.com"

我的口味不太简单:
MPZ(3628800)
我还没有遵循所有这些线程,但是还没有任何人完成:
导入操作员
def事实(x):
返回redion(operator.mul,xrange(1,x))

# 回答18


10月22日,下午1:35,保罗·鲁丁(Paul Rudin) MPZ(3628800)

我还没有遵循所有这些线程,但是还没有任何人完成:
导入操作员
def事实(x):
返回redion(operator.mul,xrange(1,x))
我希望不是.
返回redion(operator.mul,xrange(1,x))
2
1
Trackback(最近的最新电话):
文件" ",第1行,在<模块>中
事实(1)
文件" ",第2行,实际上
返回redion(operator.mul,xrange(1,x))
typeError:空序列的redy(),没有初始值
Trackback(最近的最新电话):
文件" ",第1行,在<模块>中
事实(0)
文件" ",第2行,实际上
返回redion(operator.mul,xrange(1,x))
typeError:空序列的reald() E没有初始值
我认为您需要使其更加复杂.

# 回答19


10月22日,20:35,保罗·鲁丁(Paul Rudin) 也许:
导入操作员
def事实(x):
返回redion(operator.mul,xrange(2,x+1),1),1)
事实(0)
1
事实(4)
24
# 回答20


也许:
导入操作员
def事实(x):
返回redion(operator.mul,xrange(2,x+1),1),1)
要不就:
降低(operator.mul,xrange(1,x),1)
# 回答21


10月22日,下午3:38,保罗·鲁丁(Paul Rudin) 要不就:
降低(operator.mul,xrange(1,x),1)
不,仍然不起作用:
返回redion(operator.mul,xrange(1,x+1),1)
6
2
1
1
1
1
1
如果x为负,则应提出例外.
我的原始版本(与蒂姆·蔡斯(Tim Chase)相同,除了
X == 1的测试是不需要的):
如果x == 0:
返回1
别的:
返回redred(operator.mul,xrange(1,x+1))
6
2
1
1
Trackback(最近的最新电话):
文件" ",第1行,在
事实(-1)
文件" ",实际上是第5行
返回redred(operator.mul,xrange(1,x+1))
typeError:空序列的redy(),没有初始值
# 回答22


10月22日,下午4:39," Mensana ...@aol.com" 不,仍然不起作用:
返回redion(operator.mul,xrange(1,x+1),1)
对不起,我误解了您提出的解决方案.你有过
Xrange(1,X)不是Xrange(1,X+1).前者唯一的回报
X == 0和X == 1的正确阶乘.
对困惑感到抱歉.
6
2
1
1
1
1
1
如果x为负,则应提出例外.
我的原始版本(与蒂姆·蔡斯(Tim Chase)相同,除了
X == 1的测试是不需要的):
如果x == 0:
返回1
别的:
返回redred(operator.mul,xrange(1,x+1))
6
2
1
1
Trackback(最近的最新电话):
文件" ",第1行,在
事实(-1)
文件" ",实际上是第5行
返回redred(operator.mul,xrange(1,x+1))
typeError:空序列的redy(),没有初始值 - 引用的文本 -
- 显示引号文字 -
# 回答23


不过,为什么您不想要而不是RAISNG异常
无效的价值与在我的书中提出例外一样好/坏.
由于您不能对无对象进行数学
会引起例外:
我通常更喜欢我的功能返回半敏感结果
(在这种情况下,对我来说没有任何意义,因为真的没有
"负面阶乘"的定义).它也适合我的头
在我的SQL旁边,可以返回零值/表达式
并在没有整个查询掉落的情况下进行了评估.
我想如果您真的想使用这个例外
lambda疯狂,您可以将整个结果包裹在" 0 +"中
([身体])"如果身体恢复为null,它将向上推
例外雏菊(有稍微误导的异常信息).
-tkc
# 回答24


" Marco Mariani" 是的.并燃烧他们的汽车以引起他们的注意!
要求某人写阶乘算法之前他知道wtf a
阶乘"是",要么疯狂,要么是故意的最终表现
部门之间缺乏合作和协调.
从那以后,我对此感到有点强烈
期望我使用我尚未教过的数学...
;-)
我将避免评论介绍的概念
递归成CS的第一门课程 - 我对自己的能力感到非常污染
在精神上"查看"小处理器中的堆栈增长
评论.
-Hendrik
# 回答25


10月23日,上午8:53," Hendrik Van Rooyen" 是的.并燃烧他们的汽车以引起他们的注意!
要求某人写阶乘算法之前他知道wtf a
阶乘"是",要么疯狂,要么是故意的最终表现
部门之间缺乏合作和协调.
从那以后,我对此感到有点强烈
期望我使用我尚未教过的数学...
;-)
我将避免评论介绍的概念
递归成CS的第一门课程 - 我对自己的能力感到非常污染
在精神上"查看"小处理器中的堆栈增长
评论.
- 亨德里克
完全同意这一观点.接收后
当第一次引入Haskell并被告知看时,此类问题的结局
在其中写的数据库中,并通过它来努力(没有
在数据库,锁或任何行话中开始课程)
有时会发现自己几乎无助.
很难谷歌了解您不知道的事情.
递归电话是一个有趣但又很痛苦的事情...
# 回答26


蒂姆·蔡斯(Tim Chase)写道:
我和1或没有
这样的特技表演会让一个人在这里开除
在生产代码中发现:)
嗯,的确.
def事实(n):
尝试:
返回eval('*'.join(x for x for x in范围(1,n+1)))))))
除了:
返回1
# 回答27


10月22日,23:39," Mensana ...@aol.com" 那么,问题在哪里?如果不允许的话,那是如此
对您来说很重要,添加IF语句并提出ValueError异常.
# 回答28


在10月23日,下午1:58,tokl ...@gmail.com写道:
那么,问题在哪里?如果不允许的话,那是如此
对您来说很重要,添加IF语句并提出ValueError异常.
确实,特别是考虑到事实(x)本质上只是一个
Lambda声明Marco Mariani说.
# 回答29


10月22日,上午11:45,蚂蚁 不要搜索定义... Google以获取答案!
导入Urllib
导入
urllib.urlopener.version =" mozilla/4.0"
def事实(x):
r = re.compile(r"%d!=(\ d+)"%x)
对于urllib.urlopen中的行(" http://www.google.cl/search?q=%D%21"
% X):
M = R.Search(线)
如果m:
返回int(m.group(1))
- -
罗伯托·邦瓦尔(Roberto Bonvall) ET
# 回答30


" Dennis Lee Bieber" 呵呵...在一个时期,他是参加CS专业的一个节省的恩典
教授的主要语言是Fortran(IV),Cobol(74)和
接近K&K基本的东西.哎呀,即使是汇编者课
Fortran参数处理方案(参数地址为复制到
静态当地人,并通过一个间接级别使用) - 这将需要我
今天的某个时候,要弄清楚如何甚至创建一个"堆栈"(甚至
返回地址通过保留寄存器通过并在当地保存):
呼叫,2个子地址
数据arg1-address
数据arg2-address
做一点事
.
.
.
子地址:商店,2个My-Return
负载,9 *my-return,1;索引访问
商店,9 param1
负载,9 *My-Return,2
商店,9 param2
做东西
负载,2个My-Return
Addimmediate,2 2; arg次数
调整回报
返回,2
(格式:
标签命令,注册参数
*参数;间接
参数,x;索引)
- -
Yuk.让我想起了一个日立处理器之一
有一个深度硬件"链接寄存器",该硬件告诉一个
子例程是从哪里调用的.
我在想到您打电话或推送时会成长的堆栈,
当您返回或流行时收缩.
当只有128个左右的字节,一个地址为两个字节时,
递归电话很快陷入困境.特别是如果你也
使用堆栈传递参数...
-Hendrik
# 回答31


在2007-10-23,Hendrik Van Rooyen 这就是手臂处理器的工作方式,如今它们无处不在.
# 回答32


罗伯托·邦瓦莱特(Roberto Bonvallet)写道:
您的解决方案提醒我基于Web的WTF计算器. http://worsethanfailure.com/articles...-web-calc.aspx
# 回答33


在10月23日上午6:58,Tokl ...@gmail.com写道:
那么,问题在哪里?
它返回负1的事实?
而且您没有看到我的后续消息吗?关于如何
例如,如发布的,甚至没有产生正确的答案
对于x的法律价值?
数学一致性仅对_me_很重要?
正确完成时没有必要.你没看到我的榜样吗?
# 回答34


10月23日,上午5:55,Marco Mariani 我和1或没有

嗯,的确.
def事实(n):
尝试:
返回eval('*'.join(x for x for x in范围(1,n+1)))))))
除了:
返回1
需要工作.
空闲1.2
尝试:
返回eval('*'.join(x for x for x in范围(1,n+1)))))))
除了:
返回1
6
2
1
1
1
1

# 回答35

mexhydexpor@@aol.com写道:
嗯...好的..这个给出了例外;-)
def事实(n):
尝试:
返回eval('*'.join(x for x for x in范围(1,n+1)))))))
除了:
返回n> = 0或值
打印事实(-1)
# 回答36


" Jon Ribbens" 这就是手臂处理器的工作方式,如今它们无处不在.
是的,运气更糟.市场选择...
-Hendrik
# 回答37


py-fun 这是数学怪胎答案;-)
导入数学
def阶乘(i):
n = i + 1
返回 Math.exp(-n)*(n **(n-0.5))*MATH.SQRT(2*MATH.PI)*(1. + 1./1/12/n + 1./288/nthedy2 -139./51840/nthy3)
也适用于非整数阶乘...
请参阅此处的背景http://mathworld.wolfram.com/stirlingsseries.html
- -
Nick Craig-Wood
# 回答38


在文章
Nick Craig-Wood 这是数学怪胎答案;-)
导入数学
def阶乘(i):
n = i + 1
返回Math.exp(-n)*(n **(n-0.5))*Math.sqrt(2*Math.pi)*(1. + 1./1/12/n +
1./288/nthy2-139./51840/nthedy3)
也适用于非整数阶乘...
请参阅此处的背景http://mathworld.wolfram.com/stirlingsseries.html
好吧,那是斯特林的公式.你必须担心
收敛/准确性.
怎么样(对于Intergers - 简单的版本):
def阶乘(i):
事实= 1.0
对于Xrange(i)中的n:
事实= n*事实
返回事实
甚至可能有一个数组方法可以适应
产品.有产品方法吗? (类似于总和方法)
然后你可以使用,
arr = arange(i)+1
事实= arr.product()#或类似的东西
- -
-Lou Pecora
# 回答39


在10月24日,下午4:05,Lou Pecora 好吧,那是斯特林的公式.你必须担心
收敛/准确性.
怎么样(对于Intergers - 简单的版本):
def阶乘(i):
事实= 1.0
对于Xrange(i)中的n:
事实= n*事实
返回事实
确实很简单.
0.0
# 回答40


蒂姆·戈尔登·纳皮萨(A):
我忍不住.它不像我希望的那样优雅,但至少,
它回忆了中级课程:-)
class fact_0(对象):
值= 1
class fact_meta(对象):
def __new __(Cls,Name,Bases,Attrs):
n = attrs ['n']
class_name ='fact_%i'%n
尝试:
返回Globals()[class_name]
除了KeyError:
new_class = type(class_name,bases,{})
new_class.value = n * fact(n -1).值
new_class .__ str__ = lambda self:str(self.value)
globals()[class_name] = new_class
返回new_class
班级事实(对象):
def __新闻__(self,n_):
班级西班牙语(对象):
__ metaclass__ = fact_meta
n = n_
返回西班牙语inquisition()
打印事实(5)
打印事实(3)
打印事实(1)
# 回答41


在10月24日,下午5:19,Marek.ro ...@wp.pl写道:
我忍不住.它不像我希望的那样优雅,但至少,
它回忆了中级课程:-)
class fact_0(对象):
值= 1
class fact_meta(对象):
def __new __(Cls,Name,Bases,Attrs):
n = attrs ['n']
class_name ='fact_%i'%n
尝试:
返回Globals()[class_name]
除了KeyError:
new_class = type(class_name,bases,{})
new_class.value = n * fact(n -1).值
new_class .__ str__ = lambda self:str(self.value)
globals()[class_name] = new_class
返回new_class
班级事实 (目的):
def __新闻__(self,n_):
班级西班牙语(对象):
__ metaclass__ = fact_meta
n = n_
返回西班牙语inquisition()
打印事实(5)
打印事实(3)
打印事实(1)
我敢添加事实(0)?
120
6
1
<__ main __.fact_0对象在0x011729f0>
嗯..不确定这是什么意思,但我敢打赌我无法计算
组合.
事实(-1)呢?
120
6
1
<__ main __.fact_0对象在0x011729f0>
Trackback(最近的最新电话):
文件" c:/program files/pygtk/python/user/arty_another_factorial.py",
第31行,
打印事实(-1)
文件" c:/program files/pygtk/python/user/arty_another_factorial.py",
第21行,在__new__
班级西班牙语(对象):
文件" c:/program files/pygtk/python/user/arty_another_factorial.py",
第13行,在__new__
new_class.value = n * fact(n -1).值
文件" c:/program files/pygtk/python/user/arty_another_factorial.py",
第21行,在__new__
班级西班牙语(对象):
文件" c:/program files/pygtk/python/user/arty_another_factorial.py",
第13行,在__new__
new_class.value = n * fact(n -1).值
文件" c:/program files/pygtk/python/user/arty_another_factorial.py",
第21行,在__new__
班级西班牙语(对象):
文件" c:/program files/pygtk/python/user/arty_another_factorial.py",
第13行,在__new__
new_class.value = n * fact(n -1).值
文件" c:/program files/pygtk/python/user/arty_another_factorial.py",
第21行,在__new__
班级西班牙语(对象):
文件" c:/program files/pygtk/python/user/arty_another_factorial.py",
第13行,在__new__
new_class.value = n * fact(n -1).值
文件" c:/program files/pygtk/python/user/arty_another_factorial.py",
第21行,在__new__
班级西班牙语(对象):
文件" c:/program files/pygtk/python/user/arty_another_factorial.py",
第13行,在__new__
new_class.value = n * fact(n -1).值
文件" c:/program files/pygtk/python/user/arty_another_factorial.py",
第21行,在__new__
班级西班牙语(对象):
文件" c:/program files/pygtk/python/user/arty_another_factorial.py",
第13行,我
哇!追溯中的无限环路.不太例外
我在寻找.
# 回答42


lou pecora 在3.0中从Python中删除的"减少"函数.
导入操作员
def阶乘(n):
返回dride(operator.mul,xrange(1,n+1))
# 回答43

ma@_)maxhyde*******@wp.pl写信:
我忍不住.它不像我希望的那样优雅,但至少,
它回忆了中级课程:-)
它甚至在哈斯克尔都变得怪异. http://www.willamette.edu/~fruehr/ha...volution.html
# 回答44


在文章中<11 ******************************@e9g2000prf.googlegroups. com>,
" me heyphderydeyde@aol.com" 确实很简单.
0.0
whops,应该在那里有Xrange(i)+1.或者,更好,Xrange(2,n+1).保存
乘法.只是试图向OP展示迭代方案
这里.
- -
-Lou Pecora
# 回答45

maxhyde*****@wp.pl写道:
[...
你写了很多 样板隐藏了您在作弊的事实,不是吗?
OP明确要求进行迭代程序.
顺便说一句...编写测试单元检查测试的代码未调用
本身..可能很有趣
# 回答46


在10月25日上午2:36,保罗·鲁宾(Paul Rubin) 在3.0中从Python中删除的"减少"函数.
导入操作员
def阶乘(n):
返回降低(operator.mul,xrange(1,n+1))
由于减少已被删除,并且已知Guido不喜欢其使用
无论如何,我为py2.5及以后提出以下代码:
导入数学
def事实(n):
return Math.exp(sum(((Math.log(i))for范围内(1,n+1))))))如果n
如果您不喜欢四舍五入错误,则可以尝试:
def事实(n):
D = {" P":1L}
def f(i):d [" p"] *= i
地图(f,范围(1,n+1))
返回D [" P"]
它是读者的练习,说明为什么该代码不会
在py3k上工作
尼克
# 回答47


尼克写道:
为您服务滥用地图(). ;-)
史蒂夫
# 回答48


那没有地图,减少,杂物甚至添加呢
它的真正相互作用,如果
您想要正确的答案;)
def阶乘(n):
"""
增加我...并继续增加...
"""
导入随机
mynumer = range(n)
计数= 0
i = 10000#10 **(n+1)
对于我的范围(i):
bucket = range(n)
数字= []
对于(n)范围内的我:
k = bucket [random.randrange(0,len(bucket))]
bucket.remove(k)
number.Append(k)
如果编号== mynumer:
计数+= 1
返回int(i*1.0/count+.5)

标签: python

添加新评论