<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          素?cái)?shù)判斷代碼實(shí)現(xiàn)及其優(yōu)化

          共 4110字,需瀏覽 9分鐘

           ·

          2023-08-07 17:44

          說(shuō)在前面

          素?cái)?shù)判斷是經(jīng)典數(shù)論問(wèn)題,也是算法教學(xué)中的經(jīng)典案例,利用素?cái)?shù)定義判斷正整數(shù)n是否為素?cái)?shù),是解決復(fù)雜素?cái)?shù)問(wèn)題的基礎(chǔ),該問(wèn)題涉及循環(huán)結(jié)構(gòu)和枚舉算法,其代碼實(shí)現(xiàn)形式多樣,可作為入門(mén)級(jí)算法學(xué)習(xí)的經(jīng)典例題,值得深入研究。

          原型展示:

          自定義函數(shù)is_prime(n)的功能是判斷正整數(shù)n是否為素?cái)?shù),若為素?cái)?shù)返回True,否則返回False。請(qǐng)將缺失的代碼補(bǔ)充完整。

          def is_prime(n):

              flag = True

              for i in range(2, n):

                  if 填空1:

                      flag = False

              填空2

          題目解析:

          根據(jù)素?cái)?shù)的定義可知,素?cái)?shù)不能被1和它本身外的自然數(shù)整除,若n能被i整除,說(shuō)明n不是素?cái)?shù)。故第1空答案為n % i == 0。

          變量flag用來(lái)標(biāo)記n是否為素?cái)?shù),先假設(shè)n為素?cái)?shù),為flag取初值True。若n不是素?cái)?shù),則設(shè)置flag=False。函數(shù)返回flag的值表示判斷結(jié)果,故第2空答案為return flag

          拓展思考1:

          教師:函數(shù)is_prime()使用for循環(huán)來(lái)遍歷n所有可能的因數(shù),以判斷其是否為素?cái)?shù)。我們知道for語(yǔ)句和while語(yǔ)句都可以實(shí)現(xiàn)循環(huán)結(jié)構(gòu)功能,那么在本例中又該怎么做呢?

          請(qǐng)同學(xué)們?cè)诤瘮?shù)is_prime()的基礎(chǔ)上,用while循環(huán)語(yǔ)句代替for循環(huán)語(yǔ)句,編寫(xiě)代碼實(shí)現(xiàn)相同功能。

          學(xué)生甲:循環(huán)結(jié)構(gòu)必須包含3個(gè)環(huán)節(jié):為循環(huán)變量i設(shè)置初值、判斷循環(huán)結(jié)束條件和更新循環(huán)變量的值。for循環(huán)語(yǔ)句比較簡(jiǎn)明,它把這3個(gè)環(huán)節(jié)都濃縮在一條語(yǔ)句中了,而while循環(huán)需要使用3條語(yǔ)句才能實(shí)現(xiàn)這3個(gè)功能。參考代碼如下:

          def is_prime2(n):

              flag = True

              i = 2

              while i < n:

                  if n % i == 0:

                      flag = False

                  i += 1

              return flag

          拓展思考2:

          教師:函數(shù)is_prime()和is_prime2()都能夠?qū)崿F(xiàn)程序功能,但是效率太低,請(qǐng)同學(xué)們思考可以從哪些方面來(lái)改進(jìn)算法,提高程序效率?
          改進(jìn)方案一:
          學(xué)生甲:當(dāng)找到n的第一個(gè)因數(shù)以后,就可以確定n為合數(shù),沒(méi)必要再枚舉其他因數(shù)了。所以應(yīng)該在語(yǔ)句flag=False后面添加語(yǔ)句break,直接跳出循環(huán),可以提高程序效率。參考代碼如下:
          def is_prime3(n):
              flag = True
              for i in range(2, n):
                  if n % i == 0:
                      flag = False
                      break
              return flag
          def is_prime4(n):

              flag = True

              i = 2

              while i < n:

                  if n % i == 0:

                      flag = False

                      break

                  i += 1

              return flag

          教師:非常好!充分利用了break語(yǔ)句的特性,直接跳出循環(huán),減少循環(huán)次數(shù)。還有別的方法嗎?

          改進(jìn)方案二:

          學(xué)生乙:因?yàn)閚不存在大于n//2的因數(shù),故可以把i的最大值從n-1縮小到n//2,這樣就縮小了枚舉范圍。參考代碼如下:
          def is_prime5(n): #同理可以對(duì)is_prime4()進(jìn)行改進(jìn)
              flag = True
              for i in range(2, n//2+1):
                  if n % i == 0:
                      flag = False
                      break
              return flag
          學(xué)生丙:根據(jù)因數(shù)成對(duì)出現(xiàn)的特性,我們還可以進(jìn)一步縮小枚舉范圍,把i的上限設(shè)置為n的平方根。參考代碼如下:
          def is_prime6(n): #同理可以對(duì)is_prime4()進(jìn)行改進(jìn)
              flag = True
              for i in range(2, int(n**0.5)+1):
                  if n % i == 0:
                      flag = False
                      break
              return flag

          拓展思考3:

          教師:設(shè)置標(biāo)記變量flag來(lái)表示某種狀態(tài)是常用的編程技巧,在上述程序中變量flag用來(lái)標(biāo)記n是否為素?cái)?shù),最后返回flag的值。那么,變量flag是否是必需的呢?如果不定義flag,能否實(shí)現(xiàn)函數(shù)功能呢?

          自定義函數(shù)is_prime7(n)的功能是判斷正整數(shù)n是否為素?cái)?shù),若為素?cái)?shù)返回True,否則返回False。請(qǐng)將缺失的代碼補(bǔ)充完整。

          def is_prime7(n):

              i = 2

              while i < n:

                  if n % i == 0:

                      break

                  i += 1

              填空1

          學(xué)生?。焊鶕?jù)代碼可知,若n為素?cái)?shù),則程序沒(méi)有機(jī)會(huì)執(zhí)行break語(yǔ)句,while循環(huán)結(jié)束后,有i==n;否則執(zhí)行break語(yǔ)句,中途跳出while循環(huán),循環(huán)結(jié)束后仍然滿足i<n。故填空1的答案為return i == n。

          教師:非常棒!此處雖然沒(méi)有設(shè)置標(biāo)記變量,但是利用了while循環(huán)的特性,根據(jù)循環(huán)結(jié)束后循環(huán)條件是否依然成立來(lái)判斷程序是否執(zhí)行了break語(yǔ)句,構(gòu)思非常巧妙。

          改進(jìn)方案三:

          學(xué)生甲:老師,我還有更好的方法!

          教師:是嗎?說(shuō)來(lái)聽(tīng)聽(tīng)。

          學(xué)生甲:函數(shù)is_prime7()雖然構(gòu)思巧妙,但是不過(guò)直白,需要轉(zhuǎn)一道彎才能理解??紤]到這是一個(gè)自定義函數(shù),我們可以在找到n的第一個(gè)因數(shù)后直接返回False;只有當(dāng)n不存在因數(shù)時(shí),才返回True。這樣代碼更簡(jiǎn)明,參考代碼如下:

          def is_prime8(n):

              for i in range(2, int(n**0.5)+1):

                  if n % i == 0:

                      return False

              return True

          教師:太棒了!既簡(jiǎn)單明了,又清晰易懂!簡(jiǎn)直是返璞歸真??!

          最后送給大家一道課后思考題:如何使用while循環(huán)語(yǔ)句來(lái)代替函數(shù)is_prime8()中的for循環(huán)語(yǔ)句呢?


          需要本文word文檔、源代碼和課后練習(xí)答案的,可以加入“Python算法之旅”知識(shí)星球參與討論和下載文件,Python算法之旅”知識(shí)星球匯集了數(shù)量眾多的同好,更多有趣的話題在這里討論,更多有用的資料在這里分享。

          我們專(zhuān)注Python算法,感興趣就一起來(lái)!

          相關(guān)優(yōu)秀文章:

          閱讀代碼和寫(xiě)更好的代碼

          最有效的學(xué)習(xí)方式

          Python算法之旅文章分類(lèi)

          瀏覽 462
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩在线视频第一页 | sese99sese | 亚洲三级无码视频 | 欧美成人靠逼小视频 | 天天躁日日躁精品人妻 |