增量式开发(incremental development):
这个过程的核心如下:
-
一定要用一个能工作的程序来开始,每次逐渐添加一些细小增补。在任何时候遇到错误,都应该弄明白错误的位置。
-
用一些变量来存储中间值,这样你可以显示一下这些值,来检查一下。
-
程序一旦能工作了,你就应该把一些发挥『脚手架作用』的代码删掉,并且把重复的语句改写成精简版本,但尽量别让程序变得难以阅读。
练习2:
Ackermann阿克曼函数的定义如下:
A(m, n) = n+1 if m = 0
A(m−1, 1) if m > 0 and n = 0
A(m−1, A(m, n−1)) if m > 0 and n > 0.
写一个叫做ack的函数,实现上面这个阿克曼函数。用你写出的函数来计算ack(3, 4),结果应该是125.看看m和n更大一些会怎么样。
def ack(m,n):
if m==0:
return n+1
elif m>0 and n==0:
return ack(m-1,1)
elif m>0 and n>0:
return ack(m-1,ack(m,n-1))
print(ack(3,4))
谨记:每一个判断内要有一个return!!m>n的话会无穷迭代。
练习3:
回文的词特点是正序和倒序拼写相同给,比如noon以及redivider。用递归的思路来看,回文词的收尾相同,中间部分是回文词。
下面的函数是把字符串作为实际参数,然后返回函数的头部、尾部以及中间字母:
def first(word):
return word[0]
def last(word):
return word[-1]
def middle(word):
return word[1:-1]
第八章我们再看看他们是到底怎么工作的。
1.把这些函数输入到一个名字叫做palindrome.py的文件中,测试一下输出。
如果中间你使用一个只有两个字符的字符串会怎么样?一个字符的怎么样?
空字符串,比如『』没有任何字母的,怎么样?
2.写一个名叫is_palindrome的函数,使用字符串作为实际参数,根据字符串是否为回文词来返回真假。机主,你可以用内置的len函数来检查字符串的长度。
code:
def is_palindrome(word):
n=len(word)
if n<=1:
return True
if first(word)==last(word):
return is_palindrome(middle(word))
elif first(word)!=last(word):
return False
word='naaon'
print(is_palindrome(word))
练习4:
一个数字a为b的权(power),如果a能够被b整除,并且a/b是b的权。写一个叫做is_power 的函数接收a和b作为形式参数,如果a是b的权就返回真。注意:要考虑好基准条件。
code:
def is_power(a,b):
if a/b==1 or a/b==a:
return True
if a%b==0:
return is_power(a/b,b)
elif a%b!=0:
return False
print(is_power(10,2))
练习5:
a和b的最大公约数是指能同时将这两个数整除而没有余数的数当中的最大值。
找最大公约数的一种方法是观察,如果当r是a除以b的余数,那么a和b的最大公约数与b和r的最大公约数相等。基准条件是a和0的最大公约数为a。
写一个有名叫gcd的函数,用a和b两个形式参数,返回他们的最大公约数。
code:
def gcd(a,b):
if b==0:
return a
else:
return gcd(b,a%b)
print(gcd(5,3))