当前位置: 首页 > 后端技术 > Python

Python自学日记3——迭代

时间:2023-03-25 23:02:19 Python

循环写出如下递归函数:defprint\_n(s,n):ifn<=0:returnprint(s)print\_n(s,n-1)print\_n(3,4)我刚开始这样写:defprint\_n(s,n):whilen>0:print(s)n=n-1print\_n('hello',4)错误message:TypeError:print()missing1requiredpositionalargument:'n'主要原因是print_n一开始写成print。但是我觉得这段代码有问题,于是百度了一下,也没找到原因。我想按照增量开发的原则,把提示错误的print(s)的位置改成s='hello'print(s)然后还是报同样的错误,有点迷茫。是不是我之前记得的print的表达方式有问题?随便写了个print('hello'),还是报同样的错误。这让我想起jupyternotebooks有时会出现缓存现象,修改后的代码还是报原来的问题,然后我重启服务,就正常了。我这才发现上面的代码是对的,是我没有把握造成的,不然从头重启服务就好了。调试建议:减少调试时间的方法:二分法调试,比如你的程序有100行代码,每次检查一行,需要100步,你可以尝试把问题分成两半,找到中点程序,或者接近中点的地方,找一个可以检查的中间结果,加个打印语句,运行。如果报错,证明前半段代码有问题。没问题的话会在后面,然后一分为二,所以只需要6步左右就可以完成。在实践中,往往很难找到中点。我们应该想想程序哪里可能出错,哪里容易检查。还要记住增量开发、实时调试。使用牛顿法求平方根:y=(x+a/x)/2defsquare\_root(a):x=3epsilon=0.0000001whileTrue:\#print(x)y=(x+a/x)/2#此时一个固定的公式\#ifabs(y-x)=1e-15:a+=(factorial(4k)*(1103+26390*k))/factorial(k)**4*396**(4*k)k=k+1返回adaoshu=2*math.sqrt(2)/9801*api=1/daoshureturnpiestimate_pi()发现错误,提示while(factorial(4k)*(1103+26390*k))/(factorial(k)**4*396**(4*k))>=1e-15:语法错误,于是想到先把这段代码拆分出来看看哪里出了问题:defqiuzhi(k):jieguo=(factorial(4k)*(1103+26390*k))/(factorial(k)**4*396**(4*k))whilejieguo<1e-15:breakjieguo=jieguo+(factorial(4(k+1))*(1103+26390*(k+1)))/(factorial(k+1)**4*396**(4*(k+1)))returnjieguoqiuzhi(0)还是报同样的错误jieguo=(factorial(4k)*(1103+26390*k))/(factorial(k)**4*396**(4*k))语法错误。然后把它分解成一个更简单的如下:defqiuzhi_1(k):print((factorial(4k)*(1103+26390*k))/(factorial(k)**4*396**(4*k)))qiuzhi_1(1)还是报同样的问题,语法错误,但是当我直接把数字1代入(factorial(4k)*(1103+26390*k))/(factorial(k)**4*396**(4*Ink)),可以得到该值。数值类型有问题吗?然后我用类型测试了它,它是浮动的。不管我怎么看,都没有问题。如果找不到问题,就只能看答案了。这是答案代码:importmathdeffactorial(n):"""Computesfactorialofn."""ifn==0:return1else:recurse=factorial(n-1)result=n*recursereturnresultdefestimate_pi():"""计算pi的估计值。来自SrinivasaRamanujan的算法,来自http://en.wikipedia.org/wiki/Pi"""total=0k=0factor=2*math.sqrt(2)/9801而True:num=factorial(4*k)*(1103+26390*k)den=factorial(k)**4*396**(4*k)term=factor*num/dentotal+=termifabs(term)<1e-15:breakk+=1return1/totalprintestimate_pi()发现我的思路是一样的,但是我的长公式分成了几个部分,可能我的公??式代码太长了好久了,回头看看能不能找到原因。但是,这个公式有一个地方我不太熟悉,就是在判断条件的时候,我用公式的时候没有把求和公式前面的部分包括进去,正确的应该包括进去。