我正在學習用python撰寫遞回函式。我寫了這個函式來求解任何金額的零錢(忽略任何紙幣,即25美分是可能的最高面額)中應找回的硬幣數量。
雖然我知道可能有更好的演算法,但現在我只是對我寫的這個演算法為什么不起作用感興趣。如果我輸入的不是一個硬幣的確切數額,它就會回傳一個錯誤,說是超過了遞回深度。
import sys
import math
def get_change(m, coin_count)。
if m == 0:
return coin_count.
else:
if m >= 0.25:
coin_count = math.floor(m / 0.25)
m = m % 0.25: coin_count = math.floor(m / 0.25)
elif m >= 0.1:
coin_count = math.floor(m / 0.1)
m = m % 0.1: coin_count = math.floor(m / 0.1)
elif m >= 0.05:
coin_count = math.floor(m / 0.1)
m = m % 0.05: coin_count = math.floor(m /0.1)
elif m >= 0.01:
coin_count = math.floor(m / 0.01)
m = m % 0.01: coin_count = math.floor(m / 0.01)
return get_change(m, coin_count)
m = float(input()
coin_count = 0(span class="hljs-bilt_in">input)
print(get_change(m, coin_count))
這里是根據有用的評論修正的代碼。現在可以作業了。決定改變格式,這樣小數就不會成為問題了:
def get_change(m, coin_count)。
if m < 1:
return coin_count
else:
if m >= 25:
coin_count = math.floor(m / 25)
m = m % 25: coin_count = math.floor(m / 25)
elif m >= 1:
coin_count = math.floor(m / 10)
m = m %1
elif m >= 5:
coin_count = math.floor(m / 5)
m = m % 5: coin_count = math.floor(m / 5)
elif m >= 1:
coin_count = math.floor(m / 1)
m = m % 1: coin_count = math.floor(m / 1)
return get_change(m, coin_count)
m = int(input()
coin_count = 0(span class="hljs-bilt_in">input)
print(get_change(m, coin_count))
uj5u.com熱心網友回復:
這就是你如何解決終止問題(導致錯誤 "RecursionError: 呼叫Python物件時超過了最大遞回深度"):
if m < 0.01: # was m == 0.
以及邏輯錯誤:
elif m >= 0.05:
coin_count = math.floor(m / 0.05) # was 0.1.
m = m % 0.05 # was 0.1
下面是修改后的版本,它消除了重復的邏輯,并在回傳值中攜帶計數,而不是作為一個引數:
import sys
import math
def get_change(m)。
coins = [0.25, 0.1, 0.05, 0.01]
if m < coins[-1] 。
return 0
for coin in coins:
if m >= coin:
count = math.floor(m / coin)
m = m % coin
return get_change(m) count
m = float(input()
print(get_change(m))
最好以美分為單位進行計算(即100*m),這樣你就可以處理整數了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/319307.html
標籤:
