将一个大程序分解成一个个小函数,自然而然引入了调试的checkpoint。如果一个功能不能正常工作,可以考虑三种可能。1、函数获取的实参有问题,不满足某个前置条件。2.函数本身有问题,不满足某个后置条件。3、函数的返回值有问题,或者使用方式不正确。首先排除一种可能是在函数的开头添加打印语句,显示实际参数(及其类型)的值。或者您可以添加代码来显式检查先决条件。如果实际参数看起来是正确的,则在每个返回语句之前添加一个打印语句以显示返回值。如果可能,手动检查返回值。考虑使用参数调用函数,以便更轻松地测试结果。如果函数看起来没问题,请检查调用它的代码以确保返回值被正确使用(或确实被使用)。用python编写Ackermann函数如下:defack(m,n):ifm==0:returnn+1elifm>0andn==0:returnack(m-1,1)elifm>0andn>0:实参ack(3,4)中传入returnack(m-1,ack(m,n-1))时,返回值为125,试产ack(13,4),报错如下RecursionError:maximumrecursiondepthexceededincomparison报错原因:python默认的递归深度是有限的(默认是1000),所以当递归深度超过999时,会出现这样的异常被抛出。修改递归深度方法:importsyssys.setrecursionlimit(100000)#例如设置为100000。这个值的大小取决于你。由操作引起的,UI可能会导致内存溢出。回文是一个按照你想要的方式拼写的单词,例如“noon”和“redivider”。递归地,如果一个单词的首尾字母相同,并且中间有回文,则该单词为回文。以下函数接收一个字符串参数并返回中间的第一个和最后一个字母:deffirst(word):returnword[0]deflast(word):returnword[-1]defmiddle(word):returnword[1,-1]一开始我是这样调用的:middle(ab)错误返回:name'ab'isnotdefinedbecauseitisastringparameter,shouldpassinastringargument,andthenchangedthis:middle('hello'),错误如下:stringindicesmustbeintegers这个错误的意思是charactersThesubscriptofthestringmustbeaninteger.以为是字符串slice的下标内存有问题,然后先尝试了其他函数('hello')。返回也是正常的,所以如果排除下标字符串的问题,那就是中间函数本身有问题。仔细地看。原来是return返回的word[1,-1]有错误,改成word[1:-1]就解决了。写一个函数is_palindrome,接收一个字符串参数,如果是回文就返回True,否则返回False。我的代码是这样的:defis_palindrome(word):iflen(word)<=1:returnTrueeliffirst(word)==last(word):iflen(middle(word))<=1:returnTrueelse:is_palindrome(middle(word))returnFalseis_palindrome('hdedh')结果本应返回True,结果却是错误的。我最初的逻辑是按照正向逻辑,先判断单词的长度,然后判断首字母和尾字母是否相同,相同则取中间字母,再判断中间字母的长度,然后把中间的那个字母替换回is_palindrome(word),是不是不知道哪里不对,看到这个知道怎么改的请回复,谢谢.看完答案,感觉还是用逆向逻辑来判断会更好:defis_palindrome(word):iflen(word)<=1:returnTrueiffirst(word)!=last(word):returnFalsereturnis_palindrome(middle(word))is_palindrome('hded')求两个数的最大公约数,使用滚动除法的方法:错误代码:defgcd(a,b):ifa=0orb=0:#当时想把基本情况先写出来,当其中一个为0时,最大公约数为另一个值returnaifa%b==0:#如果较大的余数数除以较小的数为0,最大公约数较小的数returnbelse:gcd(a,b)=gcd(b,a%b)#如果不能整除,则重新代入较小的数和余数进入函数gcd(5,0)正确思路:1.先判断a和b是否为0,如果为0,则最大公约数为另一个值2.然后让a%b取余,如果是等于0,那么最大的common除数是b3。如果不是,则将b和a将%b的余数代入函数,重复这个过程defgcd(a,b):ifa==0:returnbelifb==0:returnaelifa%b==0:print(b)else:gcd(b,a%b)gcd(0,40)gcd(5,10)看了一些别人的代码,有的使用循环,有的需要判断a和的大小b,这些都不是必须的。但是他们中的大多数都忽略了0值。如果b==0,并且不做前面的guard代码,会报错。注意:a==0,a=0不能用,一开始这个地方出错了,print(b)正常显示,returnb可以显示gcd(10,5的情况下的输出结果)如整数整除,不能整除的如gcd(3,4)不显示结果。注意打印和返回的区别。另一种思路是通过减法求最大公约数:1.用循环判断defgcd(a,b):whilea!=b:ifa>b:a=a-belse:b=b-areturnagcd(13,40)当a=b时,取任意值作为最大公约数。如果a不等于b,则用较大的值减去较小的值,直到两者相等。##求两个数最大公约数的减法defgetGreatdivisor(a,b):ifa>b:#默认b是一个比较大的数,否则两个数交换位置a,b=b,aifb-a==a:print("最大公约数是",a)else:getGreatdivisor(b-a,a)a=int(input("first:"))b=int(input("second:"))getGreatdivisor(a,b)
