2017-04-07 95 views
0

編寫一個接受兩個參數a和b的函數冪,並計算一個上升的冪b。 示例: power(2,3)= 8 用消息引發TypeError如果輸入是其他輸入或浮點數,則參數必須是整數或浮點數。 注意:不要使用**不帶「*」計算指數的遞歸函數

我的代碼下面沒有給我我想要的輸出。請問有什麼可能是錯的?

def power(a, b): 
    if a == type(int) or a == type(float) and b == type(int) or b == type(float): 
     def add(a, b): 
      num = a 
      for i in range(b): 
       num += 1 
      return num 

     def multiply(a, b): 
      num = 0 
      for i in range(b): 
       num = add(num, a) 
      return num 

     def power(a, b): 
      num = 1 
      for i in range(b): 
       num = multiply(num, a) 
      return num 
    else: 
     return "Argument must be integer or float" 
+0

所以你不能使用'*'或'**'? – Carcigenicate

+0

如果輸出錯誤,則需要對其進行調試。你定義了3個內部函數。哪個返回的結果不好? – Carcigenicate

+0

它沒有通過if函數運行的條件 – wapadunk

回答

1

你的代碼有一堆問題。

首先,您的類型檢查是分形錯誤的(它會越深入地看着它越容易出錯)。你應該使用isinstance(a, (int, float)) and isinstance(b, (int, float))而不是你現在擁有的倒退東西。目前您正在檢查ab是否等於type(這是intfloat的類型)類別。您還有表情分組錯誤,因爲and運算符比or的綁定更緊密(當您需要(a or b) and (c or d)時,您的代碼確實爲a or (b and c) or d)。

接下來,你正在定義新功能做你的功率計算,但你永遠不會從外部power函數調用它們(所以他們永遠不會做任何事情)。如果你想保持內部功能,你需要撥打return power(a, b)。但是,通過擺脫內部函數並直接在一些嵌套循環中執行計算,可以簡化一些事情。嵌套功能只是非常少的必要。

你也沒有做你在錯誤情況下應該做的事情。你應該raise a TypeError,不返回一個字符串。

最後,我認爲你已經使得整個問題比必要的複雜得多。您的任務表示不使用**,但我懷疑您仍然可以使用*+操作員。我只是在一個循環中做一些乘法運算,而不是重新定義從頭開始的所有事情(它甚至不工作,因爲你的add函數需要+=)。

還有一點需要注意:問題陳述並沒有說明b(指數)是否總是一個整數,或者是否可以有小數部分。處理分數指數要比處理整數指數困難得多,所以我會問你的指導員,如果這實際上是作業的一部分,然後花費大量時間來解決它。可能你需要同時支持intfloat類型,但即使b是浮點數,它仍然是一個整數。

+0

謝謝!將*用於其他版本。但要糾正上面的代碼;在函數 – wapadunk

+0

中加入「返回功能(a,b)」時遇到問題您可能希望在'else'的上方,與內部函數的'def'語句具有相同的縮進級別。對於內部'power'函數使用與外部函數相同的名稱是相當尷尬的,但這不會阻止代碼運行的問題(它看起來像是在你不在的時候遞歸)。 – Blckknght

+0

糾正後它工作正常,你是一流的。 – wapadunk