阿爾法python 第五章 函數和代碼複用

打招呼函數

請用程序實現
用函數給某個人打招呼。

函數定義

def say_hello (name):
    pass

參數說明

name是一個字符串,表示名字。

返回值說明

該函數沒有返回值,調用該函數會輸出一段話:你好,xxx,認識你很高興!

示例 1

參數 輸出
name = "張三" 你好,張三,認識你很高興!

示例 2

參數 輸出
name = "李四" 你好,李四,認識你很高興!
"""
練習:打招呼函數
要求:
1. 定義函數 say_hello
2. 有 1 個參數 name 表示要給誰打招呼
3. 實現函數功能,即在控制檯打印:`你好,<name>,認識你很高興!`(注:name 是函數的參數)
"""


def say_hello (name):
    return print("你好,"+name+",認識你很高興!")
name = input()
say_hello (name)


能否組成三角形

判斷三條線段能否構成一個三角形,需要滿足兩條規則:

三角形的三條邊長必須大於零。
任意兩邊之和必須大於第三邊。

請用程序實現
用函數判斷三個數字能否構成三角形,並將判斷結果返回。

函數定義

def is_triangle (a, b, c):
    pass

參數說明

a, b, c均爲整數。

返回值說明

  • 三角形三邊長必須大於零,不滿足則返回數字-1,表示數據不合法;
  • 任意兩邊之和必須大於第三邊:
            ·不滿足則返回數字0,表示不能組成三角形;
            ·滿足則返回數字1,表示能組成三角形。

示例
在這裏插入圖片描述

"""
編寫 is_triangle 函數,此函數有 3 個參數,分別爲3個數字,
判斷這3個數字所代表的邊長能否組成一個三角形
"""
"""請實現函數"""


"""
編寫 is_triangle 函數,此函數有 3 個參數,分別爲3個數字,
判斷這3個數字所代表的邊長能否組成一個三角形
"""

def is_triangle(a, b, c):
    if a<=0 or b<=0 or c<=0:
        return -1
    if a+b>c and a+c>b and b+c>a and a-b<c and a-c<b and b-c<a:
        return 1
    else:
        return 0
a=3
b=4
c=5
print(is_triangle(a,b,c))

計算n個自然數的立方和

定義一個函數,其功能是計算 n 個自然數的立方和,如下圖所示。請編寫函數完成要求。

立方和

1. 定義函數 sumOfSeries
2. 有 1 個參數 n 表示自然數的個數
3. 有 1 個返回值,返回自然數的立方和
4. 調用函數,使函數執行後在控制檯打印:'和爲:xx’

請在右側編輯器中編寫代碼,完成練習。

# 定義立方和的函數
def sumOfSeries(n):
    s=0
    for i in range(1,n+1):
        s += i**3
    return str(s)
  
   # 調用函數
print("和爲:",sumOfSeries(5)) 

簡單計算器實現

請用程序實現
用函數實現 加、減、乘、除 的運算。

函數定義

# 加法函數
def addition (num1, num2):
    pass

# 減法函數
def subtraction (num1, num2):
    pass

# 乘法函數
def multiplication (num1, num2):
    pass

# 除法函數
def division (num1, num2):
    pass

參數說明

num1,num2均爲整數,表示需要進行計算的兩個數字。

返回值說明

四個函數的返回值,均爲執行對應操作後計算出來的值。

這裏使用加法函數做演示

示例 1

參數 返回
num1 = 3
num2 = 4
7

示例 2

參數 返回
num1 = 9
num2 = 1
10
# 定義加法函數 addition
def addition (num1, num2):
    return num1+num2
# 定義減法函數 subtraction
def subtraction (num1, num2):
    return num1-num2

# 定義乘法函數 multiplication
def multiplication (num1, num2):
    return num1*num2

# 定義除法函數 division
def division (num1, num2):
    return num1/num2
num1 = 4
num2 = 5
print(multiplication(num1,num2))

轉換秒爲時間

1 天有 86400 秒,那麼 100000 秒相當於多長時間呢?

請用程序實現
用函數實現,將一個指定的秒數轉換爲[天, 時, 分, 秒]的數據格式,並將其返回。

函數定義

def convert_from_seconds (seconds):
    pass

參數說明

seconds是一個整數,表示待轉換的秒數。

返回值說明

函數返回一個列表,列表內存儲的值分別爲[天, 時, 分, 秒],且0 ≤ 秒 ≤ 590 ≤ 分 ≤ 590 ≤ 時 ≤ 23天 ≥ 0

示例 1

參數 返回
seconds = 610 [0, 0, 10, 10]

示例 2

參數 返回
seconds = 100000 [1, 3, 46, 40]
# 定義一個 convert_from_seconds 函數, 參數 seconds, 返回表示時間的列表
def convert_from_seconds(seconds):
    a=seconds//86400
    b=seconds%86400//3600
    c=seconds%3600//60
    d=seconds%60
    list=[]
    list.append(a)
    list.append(b)
    list.append(c)
    list.append(d)
    return list
seconds = 100000
print(convert_from_seconds(seconds))


最大公約數

請用程序實現
用函數計算兩個整數的最大公約數,並將計算結果返回。

函數定義

def common_divisor (num1, num2):
    pass

參數說明

num1, num2均爲正整數。

返回值說明

返回值爲整數,且爲num1和num2的最大公約數。

示例 1

參數 返回
num1 = 24
num2 = 16
8

示例 2

參數 返回
num1 = 25
num2 = 15
5
# 定義並實現函數 common_divisor
def common_divisor (num1, num2):
    n=min(num1,num2)
    for i in range(1,n+1):
        if ((num1%i==0) and (num2%i==0)):
             res=i
    return res
# 調用函數
result = common_divisor(24, 16)
print(result)

楊輝三角

楊輝三角,又稱賈憲三角形、帕斯卡三角形,是二項式係數在三角形中的一種幾何排列。以下是楊輝三角的前十行:

       	          1
      	 	    1   1
    	  	  1   2   1
  	 	    1   3   3   1
           1   4   6   4   1
         1   5   10  10  5   1
       1   6   15  20  15  6   1
     1   7   21  35  35  21  7   1  
   1   8   28  56  70  56  28  8   1 
 1   9   36  84  126 126 84  36  9   1

由上可以看出:

每行端點與結尾的數爲 1
每個數等於它上方兩數之和
每行數字左右對稱,且由 1 開始逐漸變大
第 n 行的數字有 n 項

請用程序實現
用函數實現,返回一個指定行數的楊輝三角數列。

函數定義

def pascal_triangle (num):
    pass

參數說明

num是一個整數,表示需要輸出的行數。

返回值說明

函數返回一個列表,列表內存儲的值爲楊輝三角某一行的數據。

示例 1

參數 返回
3 [1, 2, 1]

示例 2

參數 返回
6 [1, 5, 10, 10, 5, 1]
# 定義函數 pascal_triangle 接受參數 num,並返回楊輝三角第 num 行
def pascal_triangle(num):
    # j行的數據, 應該由j - 1行的數據計算出來.
    # 假設j - 1行爲[1,3,3,1], 那麼我們前面插入一個0(j行的數據會比j-1行多一個),
    # 然後執行相加[0+1,1+3,3+3,3+1,1] = [1,4,6,4,1], 最後一個1保留即可.
    r=[1]
    for i in range(1,num):
        r.insert(0,0)
        # 因爲i行的數據長度爲i+1, 所以j+1不會越界, 並且最後一個1不會被修改.
        for j in range(i):
            r[j]=r[j]+r[j+1]
    return r

print(pascal_triangle(3))


線性查找

線性查找指按一定的順序檢查列表中每一個元素,直到找到所要尋找的特定值爲止示。
定義一個函數,其功能是線性查找列表中的元素,如下圖所示。請編寫函數完成要求。

在這裏插入圖片描述

請用程序實現:定義線性查找函數 linear_searching,接受三個參數 要進行查找的列表(list)、列表長度(size)、目標元素(target),在 list 中查找 target,如果 target 在 list 中則將 target 的索引返回;否則返回數字 -1。

# 定義函數 linear_searching 接受參數 list, size, target,並將查找結果返回
def linear_searching(list, size, target):
    for i in range(size):
        if list[i] ==target:
            return i
    return -1
list=['a','b','w','q','g']
size=len(list)
target='b'

print(linear_searching(list, size, target))
        

七段數碼管繪製

七段數碼管是一種展示數字的有效方式。

在這裏插入圖片描述在這裏插入圖片描述

請用程序繪製當前系統時間對應的七段數碼管,效果如下:

在這裏插入圖片描述

要求如下:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬
(1) 使用 time 庫獲得系統當前時間,格式如下:20190411‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬
(2) 繪製對應的七段數碼管‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬
(3) 數碼管風格不限‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬

#七段數碼管的繪製
import turtle as t
import time
def drawgap():
    t.pu()
    t.fd(5)
def drawline(draw):#繪製單段數碼管
    t.pendown() if draw else t.penup()
    t.fd(40)
    drawgap()
    t.right(90)
def drawdigit(digit):#根據數值繪製七段數碼管
    drawline(True) if digit in [2,3,4,5,6,8,9] else drawline(False)
    drawline(True) if digit in [0,1,3,4,5,6,7,8,9] else drawline(False)
    drawline(True) if digit in [0,2,3,5,6,8,9] else drawline(False)
    drawline(True) if digit in [0,2,6,8] else drawline(False)
    t.left(90)
    drawline(True) if digit in [0,4,5,6,8,9] else drawline(False)
    drawline(True) if digit in [0,2,3,5,6,7,8,9] else drawline(False)

    drawline(True) if digit in [0,1,2,3,4,7,8,9] else drawline(False)
    t.left(180)
    t.pu()#爲繪製後續數字確定位置
    t.fd(20)#爲繪製後續數字確定位置
def drawdate(date):#獲取日期
    t.pencolor("green")
    for i in date:
        if i == '年':
            t.write('年',font = ("Arial",18,"normal"))
            t.pencolor("blue")
            t.fd(40)
        elif i == "月":
            t.write('月',font = ("Arial",18,"normal"))
            t.pencolor("yellow")
            t.fd(40)
        elif i == "日":
            t.write('日',font = ("Arial",18,"normal"))
            t.pencolor("red")
        else:
            drawdigit(eval(i))#通過eval()將數字變成整數
def main(date):
    t.setup(1500,650,20,20)
    t.pu()
    t.fd(-600)
    t.pensize(5)
    drawdate(time.strftime("%Y年%m月%d日",time.gmtime()))
    t.fd(40)
    t.color("red")
    drawdate(date)
    t.hideturtle()
    t.done()
main(input("請輸入一個年月日,例:2019年01月22日:\n"))


斐波那契數列計算

形如1,1,2,3,5,8…的數列,被稱之爲斐波那契數列。這個數列的特點是從第三個數字開始,每個數字都等於前兩個數字之和。

請用程序實現
用函數實現,計算斐波那契數列某項的值,並將計算結果返回。

函數定義

def fbi (num):
    pass

參數說明

num是一個整數,表示斐波那契數列的項數。

返回值說明

函數返回一個整數,該整數爲斐波那契數列第 num 項的值。

示例 1

參數 返回
4 3

示例 2

參數 返回
6 8
# 定義一個 fbi 函數,參數 num,返回斐波那契數列第 num 項的值。
def fbi (num):
    if num == 1 or num == 2:
        return 1
    else:
        return fbi (num-1) +fbi (num-2)
num = eval(input())
print(fbi(num))

漢諾塔實踐

請用程序實現
用函數實現漢諾塔的移動步驟拆解。

函數定義

def hanoi (n, src, dst, mid):
    pass

參數說明

n是整數,表示圓柱A 上面的圓盤個數。
src是大寫字母A,表示最左邊的圓柱。
dst是大寫字母C,表示最右邊的圓柱。
mid是大寫字母B,表示中間的圓柱。

返回值說明

此函數沒有返回值,調用函數後函數輸出圓盤移動的步驟。

# 請在...補充一行或多行代碼
count = 0

def hanoi (n, src, dst, mid):
    global count
    if n == 1:
        print("{}: {}->{}".format(1, src, dst))
        count += 1
    else:
        #先把最上面的所有盤src->mid,移動過程用到dst
        hanoi(n-1,src,mid,dst)
        #把最下面的盤src->dst
        print("{}: {}->{}".format(n, src, dst))
      #  print(f"第{n}個盤從{src}-->{dst}")
        #把mid塔的所有盤從mid-->dst,移動過程使用到a
        hanoi(n-1,mid,dst,src)
hanoi(3, "A", "C", "B")
print(count)

合法的用戶名

有一些網站註冊用戶時,會對用戶名長度進行限制,比如用戶名的長度必須在6(含)~18(含)位之間。

請用程序實現
用函數實現對用戶名的合法性進行檢查。

函數定義

def check_username (username):
    pass

參數說明

username是一個任意長度的字符串,表示待檢查的用戶名。

返回值說明

如果用戶名長度在6(含)~18(含),則用戶名有效,返回True;否則返回False

示例 1

參數 返回
username = ‘zhangsan’ True

示例 2

參數 返回
username = ‘lisi’ False
"""
實現 check_username 函數,檢查 username 是否有效
username 長度在 6-18 位之間,返回 True,否則返回 False
"""
def check_username(username):
    if 6 <= len(username) <= 18:
        return True
    else:
        return False
username = input()
print(check_username(username))

科赫雪花小包裹

科赫曲線,也叫雪花曲線。繪製科赫曲線。
在這裏插入圖片描述

科赫雪花1科赫雪花2

請補充編程模板中代碼,完成功能:獲得用戶輸入的整數level,作爲階,繪製level階科赫曲線。

# 請在...補充一行或多行代碼

import turtle
def koch(size, n):
    if n==0:
        turtle.fd(size)
    else:
        for angle in [0,60,-120,60]:
            turtle.left(angle)
            koch(size/3,n-1)

def main(level):
    turtle.setup(600,600)
    turtle.penup()
    turtle.goto(-200, 100)
    turtle.pendown()
    turtle.pensize(2)
    koch(400,level)
    turtle.right(120)
    koch(400,level)
    turtle.right(120)
    koch(400,level)
    turtle.hideturtle()   
    
try:
    level = eval(input("請輸入科赫曲線的階: "))
    main(level)
except:
    print("輸入錯誤")

密碼的強度

密碼是賬戶的重要安全保障,涉及到安全問題,太簡單的密碼容易被猜到或破解。

請用程序實現
用函數實現一個校驗密碼強度的函數,用於提醒用戶在註冊時,密碼是否足夠安全。

以下爲密碼強度校驗規則:

密碼長度在 6 位及以上,強度+1,在 8 位及以上,強度 +212位及以上,強度 +4
大寫字母,強度 +2
除字母外,還包含數字,強度+2
除字母、數字以外字符強度 +2

函數定義

def passworld_strength (pwd):
    pass

參數說明

pwd是一個字符串,表示需要檢查的密碼。

返回值說明

函數返回一個整數,表示密碼強度。

示例 1

參數 返回
pwd = ‘aA23’ 4

示例 2

參數 返回
pwd = ‘aA_345678912’ 10
"""
實現密碼強度計算函數:
1. 實現函數 passworld_strength 返回 0-10 的數值,表示強度,數值越高,密碼強度越強
2. 密碼長度在 6 位及以上,強度 +1,
   在 8 位及以上,強度 +2,
   在 12 位及以上,強度 +4
3. 有大寫字母,強度 +2
4. 除字母外,還包含數字,強度 +2
5. 有除字母、數字以外字符,強度 +2
"""

def password_strength(pwd):
    intensity=0
    if len(pwd)>=12:
        intensity+=4
    elif 8<=len(pwd)<12:
        intensity+=2
    elif 6<=len(pwd)<8:
        intensity+=1
    pwdlist=list(pwd)
    for i in range(len(pwd)):
        if 'A'<=pwdlist[i]<='Z':
            intensity+=2
            break
    for i in range(len(pwd)):
        if 'A'<=pwdlist[i]<='Z' or 'a'<=pwdlist[i]<='z':
            for j in range(len(pwd)):
                if '0'<=pwdlist[j]<='9':
                    intensity+=2
                    break
        break
    for i in range(len(pwd)):
        if ('null'<=pwdlist[i]<'0') or ('9'<pwdlist[i]<='@') or ('Z'<pwdlist[i]<='`') or ('z'<pwdlist[i]<='~'):
            intensity+=2
            break
    return intensity
pwd1=str(input())
print(password_strength(pwd1))


藏頭詩

古人經常使用藏頭詩,隱晦的表達自己的想說的話,既有詩意,又能傳遞信息,比如下面這兩首詩:

蘆花叢中一扁舟,
俊傑俄從此地遊。
義士若能知此理,
反躬難逃可無憂。



我畫藍江水,
愛晚亭上楓。
秋月溶溶照,
香菸嫋嫋繞。

請用程序實現
用函數實現,將藏頭詩中隱含的意思找出來。

函數定義

def acrostic (poem):
    pass

參數說明

poem是一個列表,其保存了一首詩。

返回值說明

函數返回一個字符串,字符串爲藏頭詩中隱含的意思。

示例 1

參數 返回
poem = [“蘆花叢中一扁舟”, “俊傑俄從此地遊”,
“義士若能知此理”, “反躬難逃可無憂”]
蘆俊義反

示例 2

參數 返回
poem = [“我畫藍江水”, “愛晚亭上楓”,
“秋月溶溶照”, “香菸嫋嫋繞”]
我愛秋香
poem1 = [
    "蘆花叢中一扁舟",
    "俊傑俄從此地遊",
    "義士若能知此理",
    "反躬難逃可無憂"
]

poem2 = [
    "我畫藍江水",
    "愛晚亭上楓",
    "秋月溶溶照",
    "香菸嫋嫋繞"
]


def acrostic(poem):
    newstr=[]
    for i in range(len(poem)):
        str1=poem[i]
        rstr=list(str1)
        newstr.append(rstr[0])
        str1=""
    newstr1=''.join(newstr)
    return newstr1

print(acrostic(poem1))
print(acrostic(poem2))


統計字符出現次數

請用程序實現
用函數實現,統計字符串中指定字符出現的次數。

注意: 禁止使用count()函數。

函數定義

def sum_char (string, char):
    pass

參數說明

string是一個字符串,char是一個字符

返回值說明

函數返回一個整數,表示字符 char 在 string 中出現的次數。

示例 1

參數 返回
string = 'hello,world’
char = 'l
3

示例 2

參數 返回
string = ‘hello,world’
char = 'o
2
"""
統計字符串 string 中出現字符 char 的次數,並返回;
char 是長度爲 1 的字符串。
"""
def sum_char(string, char):
    n=0
    for i in range(len(string)):
        if string[i] == char:
            n+=1
    return n
string=input()
char=input()
print(sum_char(string, char))


文件擴展名

文件擴展名是操作系統用來標記文件類型的一種機制。通常來說,一個擴展名是跟在主文件名後面的,由一個分隔符(.)分隔。

請用程序實現
用函數實現,將文件的擴展名獲取出來。

函數定義

def file_ext (filename):
	pass

參數說明

filename是一個字符串,表示文件名。

返回值說明

如果 filename 有擴展名,則函數返回該 filename 的擴展名,否則返回文件名錯誤

示例 1

參數 返回
filename = “logo.png” png

示例 2

參數 返回
filename = “main.py” py
"""
獲取文件擴展名
說明:實現 file_ext 函數,該函數接受一個表示文件名的字符串參數 filename,返回它的擴展名
"""
def file_ext(filename):
    for i in range(len(filename)):
        if filename[i] == '.':
            return filename[i+1:]
filename = input()
print(file_ext(filename))


插入排序

插入排序(英語:Insertion Sort)是一種簡單直觀的排序算法。
它的工作原理是通過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。
定義一個函數,其功能是進行插入排序,如下圖所示。請編寫函數完成要求。

在這裏插入圖片描述
請用程序實現:定義插入排序函數 insertion_sort 接受參數 list_sort,在函數內部對 list_sort 進行插入排序,並將排序後的列表返回。

 # 定義函數 insertion_sort 接受參數 list_sort,並返回插入排序結果。
def insertion_sort(list_sort):
    n = len(list_sort)
    for j in range(n):
        i = j
        while i > 0:#和有序表中的每個一樣元素進行比較(從最後一個開始)
            if list_sort[i] < list_sort[i-1]:
                list_sort[i],list_sort[i-1] = list_sort[i-1],list_sort[i]
                i -= 1
            else:
                break
            
    return list_sort
list_sort = [9,8,8,7,6,5,4,3,2,1]
print(insertion_sort(list_sort))

選擇排序

選擇排序(Selection sort)是一種簡單直觀的排序算法。
它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,
然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。
定義一個函數,其功能是進行選擇排序,如下圖所示。請編寫函數完成要求。

在這裏插入圖片描述

選擇排序
請用程序實現: 定義選擇排序函數 selection_sort 接受參數 list_sort,在函數內部對 list_sort 進行選擇排序,並將排序後的列表返回。

# 定義函數 selection_sort 接受參數 list_sort,並返回選擇排序結果。
def selection_sort(list_sort):
    for i in range(len(list_sort)):
         for j in range(i, len(list_sort)):
                if list_sort[i] > list_sort[j]:
                    list_sort[i], list_sort[j] = list_sort[j], list_sort[i]
    return list_sort

list_sort = [9, 8, 7, 6, 5, 4, 3, 2, 1]
print(selection_sort(list_sort))

冒泡排序

冒泡排序(Bubble Sort)也是一種簡單直觀的排序算法。
它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。
走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個算法的名字由來是因爲越小的元素會經由交換慢慢"浮"到數列的頂端。
定義一個函數,其功能是進行冒泡排序,如下圖所示。請編寫函數完成要求。

在這裏插入圖片描述
請用程序實現: 定義冒泡排序函數 bubble_sort 接受參數 list_sort,在函數內部對 list_sort 進行冒泡排序,並將排序後的列表返回。

# 定義函數 bubble_sort 接受參數 list_sort,並返回冒泡排序結果
def bubble_sort(list_sort):
    n = len(list_sort)
    for i in range(n):
        for j in range(0, n-i-1):
            if list_sort[j] > list_sort[j+1] :
                list_sort[j], list_sort[j+1] = list_sort[j+1], list_sort[j]
    return list_sort
list_sort = [9, 8, 7, 6, 5, 4, 3, 2, 1]
print (bubble_sort(list_sort))


二分查找

二分搜索是一種在有序數組中查找某一特定元素的搜索算法。
搜索過程從數組的中間元素開始,如果中間元素正好是要查找的元素,則搜索過程結束;
如果某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中查找,而且跟開始一樣從中間元素開始比較。如果在某一步驟數組爲空,則代表找不到。
這種搜索算法每一次比較都使搜索範圍縮小一半。
定義一個函數,其功能是進行二分查找,如下圖所示。請編寫函數完成要求。

在這裏插入圖片描述
請用程序實現: 定義二分查找函數 binary_search 接受參數 要進行查找的列表(list_sort)、列表長度(size)、目標元素(target)。在函數內部檢查 target 是否在 list_sort 中,如果在則返回 target 的索引;如果不在則返回數字 -1。

# 定義函數 binary_search 接受參數 list_sort, size, targer,並將查找結果返回
def binary_search(list_sort, size, targer):
    low = 0
    high = size - 1
    while low <= high:
        mid = int((low + high) / 2)
        guess = list_sort[mid]
        if guess == targer:
            return mid
        if guess > targer:
            high = mid - 1
        else:
            low = mid + 1
    return -1
 
list_sort = [1,2,3,4,5,6,7,8,9,10]
targer = 3 
print(binary_search(list_sort, len(list_sort), targer)) 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章