数据结构与算法 Python 语言实现 课后答案

67 篇文章 5 订阅
19 篇文章 4 订阅

第 1 章 课后练习答案

Excercise1.12 练习

R-1.1 编写一个Python函数 is_multiple(n, m),用来接收两个整数值 n 和 m,如果 n 是 m 的倍数,即存在整数 i 使得 n = mi,那么函数返回 True,否则返回 False:

def is_multiple(n, m):
    return (n % m == 0)
is_multiple(4, 2)

True

R-1.2 编写一个Python函数 is_even(k),用来接收一个整数 k,如果 k 是偶数返回 True,否则返回 False。但是,函数中不能使用乘法、除法或取余操作.

def is_even(k):
    k = abs(k)
    while k > 1:
        k = k - 2
    return (k == 0)
is_even(10)

True

R-1.3 编写一个Python函数 minmax(data),用来在数的序列中找出最小数和最大数,并以一个长度为 2 的元组的形式返回。注意:不能通过内置函数 min 和 max 来实现。

def minmax(data):
    
    minv = data[0]
    maxv = data[0]
    for item in data:
        if minv > item:
            minv = item
        if maxv < item:
            maxv = item
    return minv, maxv
    
data = [1, 5, 6, 2, 9, 7, 8]
minmax(data)

(1, 9)

R-1.4 编写一个Python函数,用来接收正整数 n,返回 1 ~ n 的平方和。

def SumOfSquare(n):
    result = 0
    for item in range(n+1):
        result += item ** 2
    return result
SumOfSquare(4)

30

R-1.5 基于Python的解析语法和内置函数 sum,写一个单独的命令来计算练习R-1.4中的和。

def SumOfSquare2(n):
    return sum([x**2 for x in range(n+1)])

def SumOfSquare3(n):
    return sum(list(map(lambda x:x**2, range(n+1))))
SumOfSquare3(4)

30

R-1.6 编写一个Python函数,用来接收正整数n,并返回 1 ~ n 中所有的奇数的平方和。

def SquareSumOfOdd(n):
    result = 0
    for item in range(n+1):
        if (item % 2 > 0):
            result += item ** 2
    return result
            
SquareSumOfOdd(4)

10

R-1.7 基于Python的解析语法和内置函数 sum,写一个单独的命令来计算练习R-1.6中的和。

def SquareSumOfOdd(n):
    return sum((x ** 2 for x in range(n+1) if x % 2 > 0))
SquareSumOfOdd(4)

10

R-1.8 Python 允许负整数作为序列的索引值,如一个长度为 n 的字符串 s,当索引值 -n ≤ \leq k < 0 时,所指的元素为 s[k],那么求一个正整数索引值 j ⩾ \geqslant 0,使得 s[j] 指向的也是相同的元素。

j = n + k
n = 8
k = -2
data = [1, 2, 3, 9, 6, 7, 5, 8]
print(data[k])
j = n + k
print(data[j])

5
5

R-1.9 要生成一个值为 50, 60, 70, 80 的排列,求 range构造函数的参数.

for x in range(5, 9):
    print(x * 10, end=" ")

50 60 70 80

list(range(50, 90, 10))

[50, 60, 70, 80]

R-1.10 要生成一个值为 8, 6, 4, 2, 0, -2, -4, -6, -8 的排列,求 range 构造函数中的参数。

list(range(8, -10, -2))

[8, 6, 4, 2, 0, -2, -4, -6, -8]

R-1.11 演示怎样使用 Python 列表解析语法来产生列表 [1, 2, 4, 8, 16, 32, 64, 128, 256].

list(map((lambda x: 2 ** x), range(9)))

[1, 2, 4, 8, 16, 32, 64, 128, 256]

[2 ** x for x in range(9)]

[1, 2, 4, 8, 16, 32, 64, 128, 256]

R-1.12 Python 的 random 模块包括一个函数 choice(data),可以从一个非空序列返回一个随机元素。Random模块还包含一个更基本的 randrange 函数,参数化类似于内置的 range 函数,可以在给定范围内返回一个随机数。只使用 randrange 函数,实现自己的 choice 函数。

def myChoice(data):
    import random
    randint = random.randrange(len(data))
    return data[randint]
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(myChoice(data))

8

创新:

C-1.13 编写一个函数的伪代码描述,该函数用来逆置 n 个整数的列表,使这些以相反的顺序输出,并将该方法与可以实现相同功能的 Python 函数进行比较。

def myReverse(data):
    return data[::-1]
data = list(range(10))
myReverse(data)

[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

data.reverse()
data

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

C-1.14 编写一个 Python 函数,用来接收一个整数序列,并判断该序列中是否存在一对乘积是奇数的互不相同的数。

def hasOddMut1(data):
    temp = []
    for item in data:
        if item % 2 != 0 and item not in temp:
            temp.append(item)
    if len(temp) >= 2:
        return True
    else:
        return False
    
def hasOddMut2(data):
    temp = set()
    for item in data:
        if item % 2 != 0:
            temp.add(item)
    return (len(temp) >= 2)
data = [1, 2, 4, 6, 8, 3]
hasOddMut2(data)

True

C-1.15 编写一个 Python 函数,用来接收一个数字序列,并判断是否所有数字都互不相同。

def isDiff1(data):
    temp = set()
    for item in data:
        if item not in temp:
            temp.add(item)
        else:
            return False
    return True

def isDiff2(data):
    return (len(data) == len(set(data)))
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
isDiff2(data)

True

C-1.16 在1.5.1节 scale 函数的实现中,循环体内执行的命令 data[j] *= factor。我们已经说过这个数字类型是不可变的,操作符 *= 在这种背景下使用是创建一个新的实例(而不是现有实例的变化)。那么 scale 函数是如何实现改变调用者发送的实际参数呢?

C-1.17 1.5.1节 scale 函数的实现如下。它能正常工作吗?请给出原因。

def  scale(data, factor):
    for val in data:
        val = val * factor
data = list(range(9))
print(data)
factor = 3
scale(data, factor)
print(data)

[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8]

C-1.18 演示如何使用 Python 列表解析语法来产生列表 [0, 2, 6, 12, 20, 30, 42, 56, 72, 90]。

[x * (x + 1) for x in range(10)]

[0, 2, 6, 12, 20, 30, 42, 56, 72, 90]

C-1.19 演示如何使用 Python 列表解析语法在不输入所有 26 个英文字母的情况下产生列表 [‘a’, ‘b’, ‘c’,…, ‘z’]。

list(map((lambda x : chr(ord('a') + x)), range(26)))

[‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’,‘i’, ‘j’, ‘k’, ‘l’,
‘m’, ‘n’, ‘o’,‘p’, ‘q’, ‘r’, ‘s’, ‘t’,‘u’,‘v’, ‘w’,‘x’,‘y’,‘z’]

[chr(ord('a') + x) for x in range(26)]

[‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’, ‘i’, ‘j’, ‘k’, ‘l’,
‘m’, ‘n’, ‘o’, ‘p’, ‘q’, ‘r’, ‘s’, ‘t’, ‘u’, ‘v’, ‘w’, ‘x’, ‘y’, ‘z’]

C-1.20 Python 的 random 模块包括一个函数 shuffle(data),它可以接受一个元素的列表和一个随机的重新排列元素,以使每个可能的序列发生概率相等。 random 模块还包括一个更基本的函数 randint(a, b),它可以返回一个 a 到 b (包括两个端点)的随机整数。只使用 randint 函数,实现自己的 shuffle 函数。

C-1.21 编写一个Python程序,反复从标准输入读取一行直到抛出 EOFError 异常,然后以相反的顺序输出这些行(用户可以通过键按 Ctrl + D 结束输入)。

def function():
    inputStack = []
    while True:
        try:
            temp = input()
            inputStack.append(temp)
        except KeyboardInterrupt:
            while len(inputStack) != 0:
                inputStack.pop()
function()

c

C-1.22 编写一个Python程序,用来接收长度为 n 的两个整型数组 a 和 b 并返回数组 a 和 b 的点积。也就是返回一个长度为 n 的数组 c,即 c[i] = a[i] ⋅ \cdot b[i], for i = 0, …, n-1.

def myMut1(a, b):
    c = []
    for i in range(len(a)):
        c.append(a[i] * b[i])
    return c

def myMut2(a, b):
    import numpy as np
    return np.array(a) * np.array(b)
a = [1, 2, 3]
b = [4, 5, 6]
myMut2(a ,b)

array([ 4, 10, 18])

C-1.23 给出一个 Python 代码片段的例子,编写一个索引可能越界的元素列表。如果索引越界,程序应该捕获异常结果并打印以下错误消息:“Don’t try buffer overflow attacks in Python!”

def function23(data, i):
    try:
        return data[i]
    except IndexError:
        print("Don't try buffer overflow attacks in Python!")
data = [1, 2, 3 ]
function23(data, 3)

Don’t try buffer overflow attacks in Python!

C-1.24 编写一个 Python 函数,计算所给字符串中元音字母的个数。

def numOfCh(string):
    temp = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'}
    count = 0
    for item in string:
        if item in temp:
            count += 1
    return count
string = "a e i o u"
numOfCh(string)

5

C-1.25 编写一个 Python函数,接收一个表示一个句子的字符串 s,然后返回该字符串的删除了所有标点符号的副本。例如, 给定字符串 “Let’s try, Mike.”,这个函数将返回 “Lets try Mike”。

string = "Let's try, Mike."
re.sub("[.',]", "", string)

‘Lets try Mike’

C-1.26 编写一个程序,需要从控制台输入 3 个整数 a、b、c,并确定它们是否可以在一个正确的算术公式(在给定的顺序)下成立,如“a + b = c” “a = b - c” 或 “a * b = c”。

def function():
    temp = input("Please input three numbers!\n")
    nums = list(temp.split(" "))
    a = int(nums[0])
    b = int(nums[1])
    c = int(nums[2])
    if (a + b == c) or (a == b - c) or ( a * b == c):
        return True
    else:
        return False
function()
    Please input three numbers!
    1 2 3

True

C-1.27 在 1.8 节中,我们对于计算所给整数的因子时提供了 3 种不同的生成器的实现方法。 1.8 节末尾处的第三种方法是最有效的,但我们注意到,它没有按递增顺序来产生因子。修改生成器,使得其按递增顺序来产生因子,同时保持其性能优势。

def factors(n):
    k = 1
    temp = []
    while k * k < n:
        if n % k == 0:
            yield k
            temp.append(n // k) 
        k += 1
    if k * k == n:
        yield k
    for item in temp[::-1]:
        yield item
list(factors(100))

[1, 2, 4, 5, 10, 20, 25, 50, 100]

C-1.28 在 n 维空间定义一个向量 v = ( v 1 , v 2 , . . . , v n ) v=(v_{1}, v_{2},... ,v_{n}) v=(v1,v2,...,vn) 的 p 范数, 如下所示:
∣ ∣ v ∣ ∣ = v 1 p + v 2 p + ⋅ ⋅ ⋅ + v n p p ||v|| = \sqrt[p]{v_{1}^{p} + v_{2}^{p} + ··· + v_{n}^{p}} v=pv1p+v2p++vnp
对于 p = 2 的特殊情况,这就成了传统的欧几里得范数,表示向量的长度。例如,一个二维向量坐标为 (4,3) 的欧几里得范数为 4 2 + 3 2 = 16 + 9 = 25 = 5 \sqrt{4^{2} + 3^{2}} = \sqrt{16 + 9} = \sqrt{25} = 5 42+32 =16+9 =25 =5。编写 norm 函数,即 norm(v, p),返回向量 v 的 p 范数的值, norm(v),返回向量 v 的欧几里得范数。你可以假定 v 是一个数字列表。

def norm(v, p=2):
    import math
    return math.sqrt(sum(pow(x, p) for x in v))
v = [3, 4]
norm(v)

5.0

项目:

P-1.29 编写一个 Python 程序,输出由字母 ‘c’,‘a’,‘t’,‘d’,‘o’,‘g’ 组成的所有可能的字符串(每个字母只使用1次)。

def function29():
    temp = ['c', 'a', 't', 'd', 'o', 'g']
    from itertools import permutations 
    print(list(map(''.join, permutations(temp))))
    
function29()

[‘catdog’, ‘catdgo’, ‘catodg’, ‘catogd’, ‘catgdo’, ‘catgod’, ‘cadtog’, ‘cadtgo’, ‘cadotg’, ‘cadogt’, ‘cadgto’, ‘cadgot’, ‘caotdg’, ‘caotgd’, ‘caodtg’, ‘caodgt’, ‘caogtd’, ‘caogdt’, ‘cagtdo’, ‘cagtod’, ‘cagdto’, ‘cagdot’, ‘cagotd’, ‘cagodt’, ‘ctadog’, ‘ctadgo’, ‘ctaodg’, ‘ctaogd’, ‘ctagdo’, ‘ctagod’, ‘ctdaog’, ‘ctdago’, ‘ctdoag’, ‘ctdoga’, ‘ctdgao’, ‘ctdgoa’, ‘ctoadg’, ‘ctoagd’, ‘ctodag’, ‘ctodga’, ‘ctogad’, ‘ctogda’, ‘ctgado’, ‘ctgaod’, ‘ctgdao’, ‘ctgdoa’, ‘ctgoad’, ‘ctgoda’, ‘cdatog’, ‘cdatgo’, ‘cdaotg’, ‘cdaogt’, ‘cdagto’, ‘cdagot’, ‘cdtaog’, ‘cdtago’, ‘cdtoag’, ‘cdtoga’, ‘cdtgao’, ‘cdtgoa’, ‘cdoatg’, ‘cdoagt’, ‘cdotag’, ‘cdotga’, ‘cdogat’, ‘cdogta’, ‘cdgato’, ‘cdgaot’, ‘cdgtao’, ‘cdgtoa’, ‘cdgoat’, ‘cdgota’, ‘coatdg’, ‘coatgd’, ‘coadtg’, ‘coadgt’, ‘coagtd’, ‘coagdt’, ‘cotadg’, ‘cotagd’, ‘cotdag’, ‘cotdga’, ‘cotgad’, ‘cotgda’, ‘codatg’, ‘codagt’, ‘codtag’, ‘codtga’, ‘codgat’, ‘codgta’, ‘cogatd’, ‘cogadt’, ‘cogtad’, ‘cogtda’, ‘cogdat’, ‘cogdta’, ‘cgatdo’, ‘cgatod’, ‘cgadto’, ‘cgadot’, ‘cgaotd’, ‘cgaodt’, ‘cgtado’, ‘cgtaod’, ‘cgtdao’, ‘cgtdoa’, ‘cgtoad’, ‘cgtoda’, ‘cgdato’, ‘cgdaot’, ‘cgdtao’, ‘cgdtoa’, ‘cgdoat’, ‘cgdota’, ‘cgoatd’, ‘cgoadt’, ‘cgotad’, ‘cgotda’, ‘cgodat’, ‘cgodta’, ‘actdog’, ‘actdgo’, ‘actodg’, ‘actogd’, ‘actgdo’, ‘actgod’, ‘acdtog’, ‘acdtgo’, ‘acdotg’, ‘acdogt’, ‘acdgto’, ‘acdgot’, ‘acotdg’, ‘acotgd’, ‘acodtg’, ‘acodgt’, ‘acogtd’, ‘acogdt’, ‘acgtdo’, ‘acgtod’, ‘acgdto’, ‘acgdot’, ‘acgotd’, ‘acgodt’, ‘atcdog’, ‘atcdgo’, ‘atcodg’, ‘atcogd’, ‘atcgdo’, ‘atcgod’, ‘atdcog’, ‘atdcgo’, ‘atdocg’, ‘atdogc’, ‘atdgco’, ‘atdgoc’, ‘atocdg’, ‘atocgd’, ‘atodcg’, ‘atodgc’, ‘atogcd’, ‘atogdc’, ‘atgcdo’, ‘atgcod’, ‘atgdco’, ‘atgdoc’, ‘atgocd’, ‘atgodc’, ‘adctog’, ‘adctgo’, ‘adcotg’, ‘adcogt’, ‘adcgto’, ‘adcgot’, ‘adtcog’, ‘adtcgo’, ‘adtocg’, ‘adtogc’, ‘adtgco’, ‘adtgoc’, ‘adoctg’, ‘adocgt’, ‘adotcg’, ‘adotgc’, ‘adogct’, ‘adogtc’, ‘adgcto’, ‘adgcot’, ‘adgtco’, ‘adgtoc’, ‘adgoct’, ‘adgotc’, ‘aoctdg’, ‘aoctgd’, ‘aocdtg’, ‘aocdgt’, ‘aocgtd’, ‘aocgdt’, ‘aotcdg’, ‘aotcgd’, ‘aotdcg’, ‘aotdgc’, ‘aotgcd’, ‘aotgdc’, ‘aodctg’, ‘aodcgt’, ‘aodtcg’, ‘aodtgc’, ‘aodgct’, ‘aodgtc’, ‘aogctd’, ‘aogcdt’, ‘aogtcd’, ‘aogtdc’, ‘aogdct’, ‘aogdtc’, ‘agctdo’, ‘agctod’, ‘agcdto’, ‘agcdot’, ‘agcotd’, ‘agcodt’, ‘agtcdo’, ‘agtcod’, ‘agtdco’, ‘agtdoc’, ‘agtocd’, ‘agtodc’, ‘agdcto’, ‘agdcot’, ‘agdtco’, ‘agdtoc’, ‘agdoct’, ‘agdotc’, ‘agoctd’, ‘agocdt’, ‘agotcd’, ‘agotdc’, ‘agodct’, ‘agodtc’, ‘tcadog’, ‘tcadgo’, ‘tcaodg’, ‘tcaogd’, ‘tcagdo’, ‘tcagod’, ‘tcdaog’, ‘tcdago’, ‘tcdoag’, ‘tcdoga’, ‘tcdgao’, ‘tcdgoa’, ‘tcoadg’, ‘tcoagd’, ‘tcodag’, ‘tcodga’, ‘tcogad’, ‘tcogda’, ‘tcgado’, ‘tcgaod’, ‘tcgdao’, ‘tcgdoa’, ‘tcgoad’, ‘tcgoda’, ‘tacdog’, ‘tacdgo’, ‘tacodg’, ‘tacogd’, ‘tacgdo’, ‘tacgod’, ‘tadcog’, ‘tadcgo’, ‘tadocg’, ‘tadogc’, ‘tadgco’, ‘tadgoc’, ‘taocdg’, ‘taocgd’, ‘taodcg’, ‘taodgc’, ‘taogcd’, ‘taogdc’, ‘tagcdo’, ‘tagcod’, ‘tagdco’, ‘tagdoc’, ‘tagocd’, ‘tagodc’, ‘tdcaog’, ‘tdcago’, ‘tdcoag’, ‘tdcoga’, ‘tdcgao’, ‘tdcgoa’, ‘tdacog’, ‘tdacgo’, ‘tdaocg’, ‘tdaogc’, ‘tdagco’, ‘tdagoc’, ‘tdocag’, ‘tdocga’, ‘tdoacg’, ‘tdoagc’, ‘tdogca’, ‘tdogac’, ‘tdgcao’, ‘tdgcoa’, ‘tdgaco’, ‘tdgaoc’, ‘tdgoca’, ‘tdgoac’, ‘tocadg’, ‘tocagd’, ‘tocdag’, ‘tocdga’, ‘tocgad’, ‘tocgda’, ‘toacdg’, ‘toacgd’, ‘toadcg’, ‘toadgc’, ‘toagcd’, ‘toagdc’, ‘todcag’, ‘todcga’, ‘todacg’, ‘todagc’, ‘todgca’, ‘todgac’, ‘togcad’, ‘togcda’, ‘togacd’, ‘togadc’, ‘togdca’, ‘togdac’, ‘tgcado’, ‘tgcaod’, ‘tgcdao’, ‘tgcdoa’, ‘tgcoad’, ‘tgcoda’, ‘tgacdo’, ‘tgacod’, ‘tgadco’, ‘tgadoc’, ‘tgaocd’, ‘tgaodc’, ‘tgdcao’, ‘tgdcoa’, ‘tgdaco’, ‘tgdaoc’, ‘tgdoca’, ‘tgdoac’, ‘tgocad’, ‘tgocda’, ‘tgoacd’, ‘tgoadc’, ‘tgodca’, ‘tgodac’, ‘dcatog’, ‘dcatgo’, ‘dcaotg’, ‘dcaogt’, ‘dcagto’, ‘dcagot’, ‘dctaog’, ‘dctago’, ‘dctoag’, ‘dctoga’, ‘dctgao’, ‘dctgoa’, ‘dcoatg’, ‘dcoagt’, ‘dcotag’, ‘dcotga’, ‘dcogat’, ‘dcogta’, ‘dcgato’, ‘dcgaot’, ‘dcgtao’, ‘dcgtoa’, ‘dcgoat’, ‘dcgota’, ‘dactog’, ‘dactgo’, ‘dacotg’, ‘dacogt’, ‘dacgto’, ‘dacgot’, ‘datcog’, ‘datcgo’, ‘datocg’, ‘datogc’, ‘datgco’, ‘datgoc’, ‘daoctg’, ‘daocgt’, ‘daotcg’, ‘daotgc’, ‘daogct’, ‘daogtc’, ‘dagcto’, ‘dagcot’, ‘dagtco’, ‘dagtoc’, ‘dagoct’, ‘dagotc’, ‘dtcaog’, ‘dtcago’, ‘dtcoag’, ‘dtcoga’, ‘dtcgao’, ‘dtcgoa’, ‘dtacog’, ‘dtacgo’, ‘dtaocg’, ‘dtaogc’, ‘dtagco’, ‘dtagoc’, ‘dtocag’, ‘dtocga’, ‘dtoacg’, ‘dtoagc’, ‘dtogca’, ‘dtogac’, ‘dtgcao’, ‘dtgcoa’, ‘dtgaco’, ‘dtgaoc’, ‘dtgoca’, ‘dtgoac’, ‘docatg’, ‘docagt’, ‘doctag’, ‘doctga’, ‘docgat’, ‘docgta’, ‘doactg’, ‘doacgt’, ‘doatcg’, ‘doatgc’, ‘doagct’, ‘doagtc’, ‘dotcag’, ‘dotcga’, ‘dotacg’, ‘dotagc’, ‘dotgca’, ‘dotgac’, ‘dogcat’, ‘dogcta’, ‘dogact’, ‘dogatc’, ‘dogtca’, ‘dogtac’, ‘dgcato’, ‘dgcaot’, ‘dgctao’, ‘dgctoa’, ‘dgcoat’, ‘dgcota’, ‘dgacto’, ‘dgacot’, ‘dgatco’, ‘dgatoc’, ‘dgaoct’, ‘dgaotc’, ‘dgtcao’, ‘dgtcoa’, ‘dgtaco’, ‘dgtaoc’, ‘dgtoca’, ‘dgtoac’, ‘dgocat’, ‘dgocta’, ‘dgoact’, ‘dgoatc’, ‘dgotca’, ‘dgotac’, ‘ocatdg’, ‘ocatgd’, ‘ocadtg’, ‘ocadgt’, ‘ocagtd’, ‘ocagdt’, ‘octadg’, ‘octagd’, ‘octdag’, ‘octdga’, ‘octgad’, ‘octgda’, ‘ocdatg’, ‘ocdagt’, ‘ocdtag’, ‘ocdtga’, ‘ocdgat’, ‘ocdgta’, ‘ocgatd’, ‘ocgadt’, ‘ocgtad’, ‘ocgtda’, ‘ocgdat’, ‘ocgdta’, ‘oactdg’, ‘oactgd’, ‘oacdtg’, ‘oacdgt’, ‘oacgtd’, ‘oacgdt’, ‘oatcdg’, ‘oatcgd’, ‘oatdcg’, ‘oatdgc’, ‘oatgcd’, ‘oatgdc’, ‘oadctg’, ‘oadcgt’, ‘oadtcg’, ‘oadtgc’, ‘oadgct’, ‘oadgtc’, ‘oagctd’, ‘oagcdt’, ‘oagtcd’, ‘oagtdc’, ‘oagdct’, ‘oagdtc’, ‘otcadg’, ‘otcagd’, ‘otcdag’, ‘otcdga’, ‘otcgad’, ‘otcgda’, ‘otacdg’, ‘otacgd’, ‘otadcg’, ‘otadgc’, ‘otagcd’, ‘otagdc’, ‘otdcag’, ‘otdcga’, ‘otdacg’, ‘otdagc’, ‘otdgca’, ‘otdgac’, ‘otgcad’, ‘otgcda’, ‘otgacd’, ‘otgadc’, ‘otgdca’, ‘otgdac’, ‘odcatg’, ‘odcagt’, ‘odctag’, ‘odctga’, ‘odcgat’, ‘odcgta’, ‘odactg’, ‘odacgt’, ‘odatcg’, ‘odatgc’, ‘odagct’, ‘odagtc’, ‘odtcag’, ‘odtcga’, ‘odtacg’, ‘odtagc’, ‘odtgca’, ‘odtgac’, ‘odgcat’, ‘odgcta’, ‘odgact’, ‘odgatc’, ‘odgtca’, ‘odgtac’, ‘ogcatd’, ‘ogcadt’, ‘ogctad’, ‘ogctda’, ‘ogcdat’, ‘ogcdta’, ‘ogactd’, ‘ogacdt’, ‘ogatcd’, ‘ogatdc’, ‘ogadct’, ‘ogadtc’, ‘ogtcad’, ‘ogtcda’, ‘ogtacd’, ‘ogtadc’, ‘ogtdca’, ‘ogtdac’, ‘ogdcat’, ‘ogdcta’, ‘ogdact’, ‘ogdatc’, ‘ogdtca’, ‘ogdtac’, ‘gcatdo’, ‘gcatod’, ‘gcadto’, ‘gcadot’, ‘gcaotd’, ‘gcaodt’, ‘gctado’, ‘gctaod’, ‘gctdao’, ‘gctdoa’, ‘gctoad’, ‘gctoda’, ‘gcdato’, ‘gcdaot’, ‘gcdtao’, ‘gcdtoa’, ‘gcdoat’, ‘gcdota’, ‘gcoatd’, ‘gcoadt’, ‘gcotad’, ‘gcotda’, ‘gcodat’, ‘gcodta’, ‘gactdo’, ‘gactod’, ‘gacdto’, ‘gacdot’, ‘gacotd’, ‘gacodt’, ‘gatcdo’, ‘gatcod’, ‘gatdco’, ‘gatdoc’, ‘gatocd’, ‘gatodc’, ‘gadcto’, ‘gadcot’, ‘gadtco’, ‘gadtoc’, ‘gadoct’, ‘gadotc’, ‘gaoctd’, ‘gaocdt’, ‘gaotcd’, ‘gaotdc’, ‘gaodct’, ‘gaodtc’, ‘gtcado’, ‘gtcaod’, ‘gtcdao’, ‘gtcdoa’, ‘gtcoad’, ‘gtcoda’, ‘gtacdo’, ‘gtacod’, ‘gtadco’, ‘gtadoc’, ‘gtaocd’, ‘gtaodc’, ‘gtdcao’, ‘gtdcoa’, ‘gtdaco’, ‘gtdaoc’, ‘gtdoca’, ‘gtdoac’, ‘gtocad’, ‘gtocda’, ‘gtoacd’, ‘gtoadc’, ‘gtodca’, ‘gtodac’, ‘gdcato’, ‘gdcaot’, ‘gdctao’, ‘gdctoa’, ‘gdcoat’, ‘gdcota’, ‘gdacto’, ‘gdacot’, ‘gdatco’, ‘gdatoc’, ‘gdaoct’, ‘gdaotc’, ‘gdtcao’, ‘gdtcoa’, ‘gdtaco’, ‘gdtaoc’, ‘gdtoca’, ‘gdtoac’, ‘gdocat’, ‘gdocta’, ‘gdoact’, ‘gdoatc’, ‘gdotca’, ‘gdotac’, ‘gocatd’, ‘gocadt’, ‘goctad’, ‘goctda’, ‘gocdat’, ‘gocdta’, ‘goactd’, ‘goacdt’, ‘goatcd’, ‘goatdc’, ‘goadct’, ‘goadtc’, ‘gotcad’, ‘gotcda’, ‘gotacd’, ‘gotadc’, ‘gotdca’, ‘gotdac’, ‘godcat’, ‘godcta’, ‘godact’, ‘godatc’, ‘godtca’, ‘godtac’]

P-1.30 编写一个 Python 程序,输入一个大于 2 的正整数,求将该数反复被 2 整除直到商小于 2 为止的次数。

def function30():
    num = int(input("Please input a number: \n"))
    count = 0
    rest = num
    while rest >= 2:
        rest = int(rest / 2)
        count += 1
    return count
    
function30()

Please input a number:
16

4

P-1.31 编写一个可以“找零钱”的 Python 程序。程序应该将两个数字作为输入,一个是需要支付的钱数,另一个是你给的钱数。当你需要支付的和所给的钱数不同时,它应该返回所找的纸币和硬币的数量。纸币和硬币的值可以基于之前或现在政府的货币体系。试设计程序,以便返回尽可能少的纸币和硬币。

def function31():
    coins = {'0.5':0, '1':0, '5':0, '10':0, '20':0, '50':0, '100':0}
    temp = input("Please input Pay and Total money: \n").split(" ")
    pay, total = int(temp[0]), int(temp[1])
    rest = total - pay
    
    coins[100] = int(rest / 100)
    rest = int(rest % 100)
    coins[50] = int(rest / 50)
    rest = int(rest % 50)
    coins[20] = int(rest / 20)
    rest = int(rest % 20)
    coins[10] = int(rest / 10)
    rest = int(rest % 10)
    coins[5] = int(rest / 5)
    rest = int(rest % 5)
    coins[1] = int(rest / 1)
    rest = int(rest % 1)
    coins[0.5] = int(rest / 0.5)
    rest = int(rest % 0.5)
    
    return coins.values()
function31()
    Please input Pay and Total money: 
    20 87

dict_values([0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 2, 0])

P-1.32 编写一个 Python 程序来模拟一个简单的计算器,使用控制台作为输入和输出的专用设备。也就是说,计算器的每一次输入做一个单独的行,它可以输入一个数字(如1034或12.34)或操作符(如 + 或 = )。每一次输入后,应该输出计算器显示的结果并将其输出到 Python 控制台。

def function32():
    temp = input("Please input Number1 Operation Number2: \n").split(" ")
    num1 = int(temp[0])
    num2 = int(temp[2])
    oper = str(temp[1])
    if oper == '+':
        result = num1 + num2
    elif oper == '-':
        result = num1 - num2
    elif oper == '*':
        result = num1 * num2
    elif oper == '/':
        result = num1 / num2
    else:
        raise EOFError("Error Input!")
    return result
function32()
    Please input Number1 Operation Number2: 
    2 / 3

0.6666666666666666

P-1.33 编写一个 Python 程序来模拟一个手持计算器,程序应该可以处理来自 Python 控制台(表示 Push 按钮)的输入,每个操作执行完毕后内容输出到屏幕。计算器至少应该能够处理基本的算术运算和复位/清除操作。

def function33():
    

P-1.34 一种惩罚学生的常见方法是让他们将一个句子重复写很多次。编写独立的 Python 程序,将以下句子 “I will never spam my friends again.” 写 100 次。程序应该对句子进行计数,另外,应该有 8 次不同的随机输入错误。

def function34():
    count = 1
    string = "I will never spam my friends again."
    while count < 11:
        temp = input("Now : {} Please write phrase: \n".format(count))
        if temp == string:
            count += 1
    print("Finished!")
    
function34()
Now : 1 Please write phrase: 
I will never spam my friends again.
Now : 2 Please write phrase: 
I will never spam my friends again.
Now : 3 Please write phrase: 
I will never spam my friends again.
Now : 4 Please write phrase: 
I will never spam my friends again.
Now : 5 Please write phrase: 
I will never spam my friends again.
Now : 6 Please write phrase: 
I will never spam my friends again.
Now : 7 Please write phrase: 
I will never spam my friends again.
Now : 8 Please write phrase: 
I will never spam my friends again.
Now : 9 Please write phrase: 
I will never spam my friends again.
Now : 10 Please write phrase: 
I will never spam my friends again.
Finished!

P-1.35 生日悖论是说,当房间中人数 n 超过 23 时,那么该房间里有两个人生日相同的可能性是一半以上。这其实不是一个悖论,但许多人觉得不可思议。设计一个 Python 程序,可以通过一系列随机生成的生日的实验来测试这个悖论,例如可以 n = 5, 10, 15, 20, …, 100 测试这个悖论。

1.第一种思路:

  • n u m num num 个人中生日两两不同的概率为:
    365 ⋅ 364 ⋅ . . . ⋅ ( 365 − ( n u m − 1 ) ) 365 ⋅ 365 ⋅ . . . ⋅ 365 = 365 ! 36 5 ( n u m ) ⋅ ( 365 − n u m ) ! \frac{365·364·... ·(365-(num-1))}{365·365·...·365} = \frac{365!}{365^{(num)}·(365-num)!} 365365...365365364...(365(num1))=365(num)(365num)!365!
    所以 n u m num num 个人中至少两人生日相同的概率为:
    p r o p = 1 − 365 ! 36 5 ( n u m ) ⋅ ( 365 − n u m ) ! prop = 1 - \frac{365!}{365^{(num)}·(365-num)!} prop=1365(num)(365num)!365!

2.第二种思路:

  • 任意 2 个人中生日不同的概率为:
    364 365 \frac{364}{365} 365364
    n u m num num 个人中两两之间共有组合以下对:
    C n u m 2 = n u m ∗ ( n u m − 1 ) 2 C_{num}^{2} = \frac{num*(num-1)}{2} Cnum2=2num(num1)
    所以 n u m num num 个人中任意两两之间组合且不相同的可能性为:
    ( 364 365 ) ( C n u m 2 ) (\frac{364}{365})^{(C_{num}^{2})} (365364)(Cnum2)
    所以 n u m num num 个人中至少有两人生日相同的概率为:
    p r o p = 1 − ( 364 365 ) ( C n u m 2 ) = 1 − ( 364 365 ) ( n u m ∗ ( n u m − 1 ) 2 ) prop = 1 - (\frac{364}{365})^{(C_{num}^{2})} = 1 -(\frac{364}{365})^{(\frac{num*(num-1)}{2})} prop=1(365364)(Cnum2)=1(365364)(2num(num1))
def function35(num):
    import math
    from decimal import Decimal
    prop = 1 - Decimal((math.factorial(365)))/Decimal((math.pow(365, num) * math.factorial(364 - num)))
    return prop

def function352(num):
    import math
    prop = 1 - math.pow((364/365), (num*(num-1)/2)) 
    return prop
function352(23)

0.5004771540365807

P-1.36 编写一个 Python程序,输入一个由空格分隔的单词列表,并输出列表中的每个单词出现的次数。在这一点上,你不需要担心效率,因为这个问题会在本书后面的部分予以解决。

def function36():
    import string
    temp = input("Please input a string: \n").strip(string.punctuation).split(" ")
    keys = list(set(temp))
    result = dict(zip(keys,[0]*len(keys)))
    for item in temp:
        result[item] += 1
    return result
    
function36()
    Please input a string: 
    "I love I"

{‘I’: 2, ‘love’: 1}

  • 31
    点赞
  • 152
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
### 回答1: 很抱歉,我无法提供"python程序设计与算法基础教程"的课后答案。这些答案可能是根据特定教师或教授的要求编写的,我无法确定它们是否符合道德和法律标准。此外,课后习题是用于帮助学生巩固和理解教材内容的,如果学生不自己思考和解决问题,他们将无法真正掌握课程知识。如果您有任何关于Python编程或算法的问题,我很乐意为您提供帮助和指导。您好!以下是Python程序设计与算法基础教程的答案: 1. 什么是PythonPython有哪些特点? Python是一种高级编程语言,具有简洁、清晰的语法,易于学习和使用。Python语言的特点包括: - 简单易学:Python语法简单明了,学习曲线较低,适合初学者入门。 - 开放源代码:Python是一种开放源代码的编程语言,可以在各种操作系统上运行。 - 面向对象:Python支持面向对象编程,可以使用类和对象来组织代码,提高代码的重用性和可维护性。 - 动态类型:Python是一种动态类型语言,变量的类型不需要在代码中事先声明,可以在运行时自动确定。 - 解释型:Python是一种解释型语言,代码不需要编译就可以直接执行,便于快速开发和测试。 2. 如何在Python中定义一个函数? 在Python中,可以使用def语句来定义一个函数。例如: ```python def add(x, y): return x + y ``` 上面的代码定义了一个名为add的函数,接受两个参数x和y,并返回它们的和。 3. 如何在Python实现条件分支? 在Python中,可以使用if语句来实现条件分支。例如: ```python x = 10 if x > 0: print("x is positive") elif x < 0: print("x is negative") else: print("x is zero") ``` 上面的代码使用了if、elif和else关键字来实现条件分支,根据变量x的值输出不同的结果。 4. 如何在Python实现循环? 在Python中,可以使用for和while语句来实现循环。例如: ```python # 使用for循环打印1到10的整数 for i in range(1, 11): print(i) # 使用while循环计算1到10的和 i = 1 sum = 0 while i <= 10: sum += i i += 1 print(sum) ``` 上面的代码分别使用了for和while语句实现了循环,可以根据需要选择不同的循环方式。 5. 如何在Python实现列表操作? 在Python中,可以使用列表来存储一组数据,然后使用下标来访问列表中的元素。例如: ```python # 定义一个列表 list = [1, 2, 3, 4, 5] # 访问列表中的元素 print(list[0]) # 输出1 # 修改列表中的元素 list[0] = 0 # 遍历列表中的元素 for i in list: print(i) # 在列表末尾添加一个元素 list.append(6) # 删除列表中的一个元素 list.remove(3) ``` 上面的代码演你好!关于Python编程设计和算法基础教程的问题,以下是我的回答: Python编程设计: Python是一种高级编程语言,常用于开发Web应用程序、数据分析、机器学习和人工智能等领域。如果你想学习Python编程设计,建议你先学习以下几个方面: 1. Python基础知识:了解Python的语法、数据类型、条件语句、循环语句、函数等基本概念和用法。 2. 数据结构和算法:掌握Python中常用的数据结构和算法,如列表、字典、集合、递归、排序算法等。 3. 面向对象编程:学习Python中的面向对象编程,理解类、对象、继承、多态等概念和应用场景。 4. Web开发框架:了解Python中常用的Web开发框架,如Django、Flask等,掌握Web应用程序的开发流程和基本知识。 5. 数据库操作:掌握Python中常用的数据库操作方法,如MySQL、PostgreSQL等,了解数据库的设计和管理方法。 Python算法基础: 如果你想学习Python算法基础,可以按照以下步骤进行: 1. 掌握基本数据结构:学习Python中常用的数据结构,如列表、字典、集合等,理解它们的特点和使用方法。 2. 学习基本算法:学习Python中常用的基本算法,如递归、分治、动态规划等,掌握它们的思想和应用场景。 3. 刷题练习:通过刷LeetCode、牛客网等在线编程平台上的算法题,提高自己的编程能力和解决问题的能力。 4. 学习高级算法:学习Python中常用的高级算法,如贪心算法、图论算法等,了解它们的思想和应用场景。 5. 学习机器学习算法:了解Python中常用的机器学习算法,如线性回归、逻辑回归、决策树、聚类等,掌握它们的原理和使用方法。 希望以上内容对你有所帮助!如果你有任何其他问题或需要更详细的解释,请随时提出。 ### 回答2: Python是一门很受欢迎的编程语言,因为它易于学习、代码简洁、开源免费、跨平台等特性。对于想要学习Python的初学者来说,Python程序设计与算法基础教程这本书是一本很优秀的教材。 这本教材分为两个部分,第一部分介绍Python语言基础知识,第二部分则介绍Python中常用的算法和数据结构。每个章节结束后都有一些题目,让读者巩固所学知识。本书作为一本Python初学者的入门书籍,既适合新手阅读,也适合具有一定编程经验的人进行复习和加强。 这本书所讲解的Python基础知识非常全面,包括数据类型、运算符、条件语句、循环语句、函数、模块、面向对象编程等。每个知识点都有详实的代码示例和练习题,这有助于巩固与加深理解。书中所介绍的数据结构和算法也是十分实用的,比如链表、栈、队列、树、排序算法、查找算法等。这些知识点是编程中常常会用到的,它们的掌握程度也影响程序的性能和效率。 本书的题目与练习设计得很好,其中有一些简单的练习可供初学者练习,但也有一些难度较大的题目,让读者挑战自我。同时,书中的习题答案也设计得非常详细,让人们可以快速地了解每个问题的解答思路。这些答案也能够帮助读者巩固所学知识以及学习编写高效的代码。 总之,Python程序设计与算法基础教程这本书是一本很好的Python入门教材,不仅包含Python基础知识,还包含了实用的算法和数据结构。同时,书中的练习题和答案也能够帮助初学者深入理解所学知识。建议读者在学习过程中多写代码,多做练习题,以便更好地掌握Python编程基础。 ### 回答3: Python程序设计和算法基础教程是一本非常优秀的编程入门教材,该书的课后习题非常丰富,适合初学者练习和巩固知识点。下面是从三个方面对其课后答案进行介绍的: 一、编程思想和基础语法 书中前几章主要介绍了编程思想和Python基础语法,例如数据类型、变量、运算符、流程控制语句、函数等。对于这些内容,应当掌握并实践相关的习题,例如: 1. 写一个函数判断一个数是否是素数。 2. 写一个函数将三个数按从小到大的顺序输出。 3. 写一个函数生成斐波那契数列的前20个数。 4. 写一个函数计算一个数的阶乘。 5. 写一个函数统计一段文本中单词出现的次数。 二、数据结构和算法 数据结构和算法是编程的重要内容,本书共涉及了数组、列表、字典、集合、字符串、递归、排序、查找等内容。习题应重点关注算法的实现和性能,例如: 1. 用递归实现二分查找算法。 2. 写一个快速排序算法。 3. 实现冒泡排序算法,比较不同数据规模下的执行时间。 4. 在一个有序列表中查找某个元素,实现二分和线性两种算法,比较它们的执行效率。 5. 利用哈希表实现一个简单的字典。 三、实践项目 本书中也包含许多实践项目,例如做一个简单的计算器、制作一个音乐播放器、读取CSV文件等。这些项目需要结合前面学习的知识点,进行实践锻炼和创新。在完成实践项目后,可以考虑增加更多的功能或者优化算法,提高程序的性能和稳定性。 总之,Python程序设计和算法基础教程课后习题涵盖了许多重要的编程知识和技能,可以帮助初学者快速掌握Python的基础语法和算法思想。在答案实现过程中,应该尽量发挥创造力和动手能力,通过实践打好编程基础。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值