算法设计与应用作业

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

猜你喜欢

转载自www.cnblogs.com/baobaotql/p/11666913.html