1. 程式人生 > 其它 >第87期-基礎演算法:遞迴 2的冪

第87期-基礎演算法:遞迴 2的冪

1 問題描述

給你一個整數 n,請你判斷該整數是否是 2 的冪次方。如果是,返回 true ;否則,返回 false 。
如果存在一個整數 x 使得n == 2x ,則認為 n 是 2 的冪次方。

示例 1:

輸入:n = 1
輸出:true
解釋:2**0 = 1

示例 2:

輸入:n = 16
輸出:true
解釋:2**4 = 16

示例 3:

輸入:n = 3
輸出:false

示例 4:

輸入:n = 4
輸出:true

示例 5:

輸入:n = 5
輸出:false

初始程式碼

from typing import List
class Solution:
    
def isPowerOfTwo(self, n: int) -> bool: #在此之間填寫程式碼 print(Solution().isPowerOfTwo(1)) print(Solution().isPowerOfTwo(16)) print(Solution().isPowerOfTwo(3)) print(Solution().isPowerOfTwo(4)) print(Solution().isPowerOfTwo(5))
View Code

2 解題思路

  • 標籤:遞迴
  • 判斷該數是否可以整除2,若可以,再判斷除以2後得到的數是否也可以整除2
  • 若可以一直下去直到結果為1,則返回True
  • 其他情況則返回False

#3 解題方法

from typing import List
class Solution:
    def isPowerOfTwo(self, n: int) -> bool:
        if n==0:return False
        if n==1:return True
        return n%2==0 and self.isPowerOfTwo(n/2)

print(Solution().isPowerOfTwo(1))
print(Solution().isPowerOfTwo(16))
print(Solution().isPowerOfTwo(3))
print(Solution().isPowerOfTwo(4)) print(Solution().isPowerOfTwo(5))
View Code

第1-3,8-12行:題目中已經給出的資訊,執行程式碼時要根據這些程式碼進行編輯
第4行:判斷若a等於0,則返回False
第5行:判斷若a等於1,則返回True
第6行:其他情況下,若n除以2的餘數為0且除之後得到的數也是2的冪,則返回True,若有一者不滿足,則返回False

程式碼執行結果為:

#演算法講解

這裡用到了基礎演算法:遞迴,簡單講解下這個演算法:
什麼是遞迴
程式呼叫自身的程式設計技巧稱為遞迴
遞迴做為一種演算法在程式設計語言中廣泛應用。


遞迴演算法一般用於解決三類問題:
(1)資料的定義是按遞迴定義的。(Fibonacci函式)
(2)問題解法按遞迴演算法實現。
(3)資料的結構形式是按遞迴定義的。


遞迴函式特徵
必須有一個明確的結束條件;
每次進入更深一層遞迴時,問題規模相比上次遞迴都應有所減少
相鄰兩次重複之間有緊密的聯絡,前一次要為後一次做準備(通常前一次的輸出就作為後一次的輸入)。
遞迴效率不高,遞迴層次過多會導致棧溢位(在計算機中,函式呼叫是通過棧(stack)這種資料結構實現的,每當進入一個函式呼叫,棧就會加一層棧幀,每當函式返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞迴呼叫的次數過多,會導致棧溢位)