python算法(一)
一、求数x的因子
1 x=100
2 divisors=()#初始化空的元组
3 for i in range(1,x):
4 if x%i==0:
5 divisors=divisors+(i,)
6 print divisors
二、求数x各个数位之和
1 sumdigits=0
2 for c in str(1952):
3 sumdigits +=int(c)
4 print sumdigits
5 print sumdigits
三、鸡兔同笼以及变形
1.有鸡兔两种,共有x个头,y只脚,求解鸡兔各有几只?
1 def slove(num_heads,num_legs):
2 for chicken_num in range(0,num_heads+1):
3 pig_num =num_heads-chicken_num
4 top_legs=pig_num*4+chicken_num*2
5 if top_legs==num_legs:
6 return [chicken_num,pig_num]
7 return [None,None]
8
9 def barnYard():
10 heads=int(raw_input("Enter the number of heads: "))
11 legs=int (raw_input("Enter the number of legs: "))
12 chicken,pig=slove(heads,legs)
13 if chicken==None:
14 print "不可解"
15 else:
16 print "the number of chicken is:",chicken
17 print "the number of pig is:",pig
18
19 barnYard()
2.有鸡兔,蜘蛛一共三种,共有x个头,y只脚,求解鸡兔,蜘蛛各有几只?
1 def slove1(num_heads,num_legs):
2 for spider_num in range(0,num_heads+1):
3 for chicken_num in range(0,num_heads-spider_num):
4 pig_num =num_heads-chicken_num-spider_num
5 top_legs=pig_num*4+chicken_num*2+spider_num*8
6 if top_legs==num_legs:
7 return [chicken_num,pig_num,spider_num]
8 return [None,None,None]
9
10 def barnYard1():
11 heads=int(raw_input("Enter the number of heads: "))
12 legs=int (raw_input("Enter the number of legs: "))
13 chicken,pig,spider=slove1(heads,legs)
14 if chicken==None:
15 print "不可解"
16 else:
17 print "the number of chicken is:",chicken
18 print "the number of pig is:",pig
19 print "the number of spider is",spider
20
21 barnYard1()
3.2中的问题或许不只有一个解答,依次输出符合要求的解答
1 def slove2(num_heads,num_legs):
2 solutionFound=False
3 for spider_num in range(0,num_heads+1):
4 for chicken_num in range(0,num_heads-spider_num):
5 pig_num =num_heads-chicken_num-spider_num
6 top_legs=pig_num*4+chicken_num*2+spider_num*8
7 if top_legs==num_legs:
8 print "the number of chicken is:", chicken_num
9 print "the number of pig is:", pig_num
10 print "the number of spider is", spider_num
11 solutionFound=True
12 if not solutionFound:
13 print "不可解"
14
15
16 def barnYard2():
17 heads=int(raw_input("Enter the number of heads: "))
18 legs=int (raw_input("Enter the number of legs: "))
19 slove2(heads,legs)
20
21 barnYard2()
四、递归判断字符串是否为回文
解法一:
1 def isPlalindrome(s):
2 if len(s)<=1:
3 return True
4 else :
5 return s[0]==s[-1] and isPlalindrome(s[1:-1])
解法二:
1 def isPlalindrome1(s,indent):
2 print indent, 'hisPalindromel called with', s
3 if 1 >= len(s):
4 print indent, 'About to return True from base case',s
5 return True
6 else:
7 ans= s[0] == s[-1] and isPlalindrome1(s[1:-1], indent + indent)
8 print indent, 'About to return ',ans
9 return ans
10
11 isPlalindrome1("abccba",1)
五、斐波那契数列
1 def fib(x):
2 sum=1;
3 if x==1 or x==0:
4 return 1;
5 else:
6 return fib(x-1)+fib(x-2)
7
8 print fib(4)
六、求数x平方根
1.二分法求解
1 def squrtRootBi(x,epsilon):
2 assert x>=0,"x must be positive"+str(x)
3 assert epsilon>0,"epsilon must be positive"+str(epsilon)
4 low=0
5 #high=x
6 high=max(x,1.0)
7 guess=(low+high)/2.0
8 ctr=1
9 while abs(guess**2-x)>epsilon and ctr<=100:
10 #print "low",low,"high",high,"guess",guess
11 if guess**2<x:
12 low=guess
13 else:
14 high=guess
15 guess=(low+high)/2.0
16 ctr+=1
17 assert ctr<=100,"not perfect square number!"
18 print "times of Iteration:",ctr," guess",guess
19 return guess
20
21 def testBi():
22 squrtRootBi(4,0.0001)
23 squrtRootBi(2, 0.0001)
24 squrtRootBi(0.25, 0.0001)
25
26 testBi()
2.牛顿迭代法求解
1 def squrtRootNR(x,epsilon):
2 assert x >= 0, "x must be positive" + str(x)
3 assert epsilon > 0, "epsilon must be positive" + str(epsilon)
4 x=float(x)
5 guess=x/2.0
6 #guess=0.001
7 diff=guess**2-x
8 ctr=1
9 while abs(diff)>epsilon and ctr<=100:
10 # print "error",diff,"guess",guess
11 guess=guess-diff/(2.0*guess)
12 diff=guess**2-x
13 ctr+=1
14 assert ctr <= 100, "not perfect square number!"
15 print "times of Iteration:", ctr, " guess", guess
16 return guess
17
18 def testBi1():
19 squrtRootNR(4,0.0001)
20 squrtRootNR(2, 0.0001)
21 squrtRootNR(0.25, 0.0001)
22
23 testBi1()