1.输入一个自然数(<90000), 分别用递归法和非递归法求其二机制表示.
# -*- coding: utf-8 -*- # @Time : 2019/10/10 21:29 # @Author : BaoBao # @Mail : [email protected] # @File : binary.py # @Software: PyCharm #recursion def recursion(n): result = '' if n == 0: return result else: result = recursion(n//2) return result + str(n%2) num_a = int(input("input a decimal number : ")) if num_a >= 90000: print("error!") else: print(recursion(num_a)) #non-recursion def non_recursion(n): s = '' while n > 0: s = str(n%2) + s # 取余后更新 s n = n//2 # 取整后更新 n return s num_b = int(input("input another decimal number : ")) if num_b >= 90000: print("error!") else: print(non_recursion(num_b))
2. 分别用递归法和非递归法求Fibonacci数列的前1000位,并比较计算时间的差异.
# -*- coding: utf-8 -*- # @Time : 2019/10/11 0:25 # @Author : BaoBao # @Mail : [email protected] # @File : Fibonacci.py # @Software: PyCharm import time #recursion def fib_recursion(n): if n == 1: return 1 elif n == 2: return 1 else: return fib_recursion(n-1) + fib_recursion(n-2) num_a = int(input("input a number : ")) tic = time.process_time() if num_a==0: print("error!") else: print(fib_recursion(num_a)) toc = time.process_time() print("time : "+ str(1000*(toc-tic))) #non_recursion def fib_loop(n): a = 0 b = 1 c = 0 for i in range(n): c = a + b a = b b = c return a num_b = int(input("input a number : ")) tic = time.process_time() if num_b==0: print("error!") else: print(fib_loop(num_b)) toc = time.process_time() print("time : " + str(1000 * (toc - tic))) #another method class Fibonacci(object): ''' 斐波那契数列迭代器 ''' def __init__(self,n): ''' :param n: int 指的是生成数列的个数 ''' self.n = n #保存当前生成的数列的第几个数据 生成器中性质,记录位置,下一个位置的数据 self.current = 0 self.a = 0 self.b = 1 def __next__(self): ''' :return:当前使用next()函数调用时,就会获取下一个数 ''' if self.current<self.n: self.a,self.b = self.b,self.a+self.b self.current +=1 return self.a else: raise StopIteration def __iter__(self): ''' :return: 迭代器的__iter__返回自身即可 ''' return self if __name__ == '__main__': num_c = int(input("input a number : ")) fib = Fibonacci(num_c) for n in fib: print(n)
3.用递归算法完成如下问题:有52张牌,使它们全部正面朝上,第一轮是从第2张开始,凡是2的倍数位置上的牌翻成正面朝下;第二轮从第3张牌开始,
凡是3的倍数位置上的牌,正面朝上的翻成正面朝下,正面朝下的翻成正面朝上;第三轮从第4张牌开始,凡是4的倍数位置上的牌按上面相同规则翻转,
以此类推,直到第一张要翻的牌超过52为止。统计最后有几张牌正面朝上,以及它们的位置号.
# -*- coding: utf-8 -*- # @Time : 2019/10/11 18:42 # @Author : BaoBao # @Mail : [email protected] # @File : card.py # @Software: PyCharm #non_recursion s = [0]*52 print(s) for i in range(1,52): for j in range(i,52): if((j+1)%(i+1)==0): if(s[j]==0): s[j]=1 else: s[j]=0 print(s) vec = [x+1 for x in range(52) if s[x]==0] print(vec) #recursion
4.一个射击运动员打靶,靶一共有10环,连开6枪打中45环的可能性有多少种? (每一枪最少是0环,最多是10环)
# -*- coding: utf-8 -*- # @Time : 2019/10/12 11:29 # @Author : BaoBao # @Mail : [email protected] # @File : shooting.py # @Software: PyCharm times = 0 def shooting(n,sum): global times if n<0: return elif (45 - sum)>(10*(n)): return elif (sum == 45) and (n == 0): times += 1 return for i in range(11): shooting(n - 1,sum + i) shooting(6,0) print('there are %d possibilities'%times)
5.在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,输出所有摆法。
# -*- coding: utf-8 -*- # @Time : 2019/10/12 17:00 # @Author : BaoBao # @Mail : [email protected] # @File : queens.py # @Software: PyCharm def is_rule(queen_tup, new_queen): """ :param queen_tup: 棋子队列,用于保存已经放置好的棋子,数值代表相应棋子列号 :param new_queen: 被检测棋子,数值代表列号 :return: True表示符合规则,False表示不符合规则 """ num = len(queen_tup) for index, queen in enumerate(queen_tup): if new_queen == queen: # 判断列号是否相等 return False if abs(new_queen - queen) == num - index: # 判断列号之差绝对值是否与行号之差相等 return False return True def arrange_queen(num, queen_tup=list()): """ :param num:棋盘的的行数,当然数值也等于棋盘的列数 :param queen_tup: 设置一个空队列,用于保存符合规则的棋子的信息 """ for new_queen in range(num): # 遍历一行棋子的每一列 if is_rule(queen_tup, new_queen): # 判断是否冲突 if len(queen_tup) == num - 1: # 判断是否是最后一行 yield [new_queen] # yield关键字 else: # 若果不是最后一行,递归函数接着放置棋子 for result in arrange_queen(num, queen_tup + [new_queen]): yield [new_queen] + result for i in arrange_queen(8): print(i)
算法分析暂时不写0.0