2017-06-19 9 views
-1

私はEdXコースの再帰について勉強し始めました.12ヶ月間最低支払額を支払った後の残りの残高を計算する反復関数を書いてきました。反復を再帰Pythonに置き換える

私は簡単に反復でそれを行うことができましたが、再帰的な方法で私の頭を包むようには見えません。

正しい方向に指摘してください。ここで

は私の反復機能

def remaining_balance_iter(balance,annualInterestRate, monthlyPaymentRate): 
    ''' 
    This code will take any balance and annual interest rate and calculate the 
    balance after one year of making the minimum payments 
    ''' 

    month = 1 
    monthly_interest_rate = annualInterestRate/12.0 

    while month <= 12: 

    minimum_monthly_payment = monthlyPaymentRate * balance 

    monthly_unpaid_balance = balance - minimum_monthly_payment 

    balance = monthly_unpaid_balance + monthly_interest_rate*monthly_unpaid_balance 

    print("Month {} Remaining balance: ".format(month) + str(round(balance,2))) 

    month += 1 

    print ("Remaining balance " + str(round(balance,2))) 

である私は、再帰関数の試みを行ってきましたが、それは仕事を必要とし、私は笑

def remaining_balance_recur(balance,annualInterestRate, monthlyPaymentRate, month): 
    ''' 
    This code will take any balance and annual interest rate and calculate the 
    balance after one year of making the minimum payments 
    ''' 

    month = 1 
    monthly_interest_rate = annualInterestRate/12.0 

    while month <= 12: 

    minimum_monthly_payment = monthlyPaymentRate * balance 

    monthly_unpaid_balance = balance - minimum_monthly_payment 

    interest = monthly_interest_rate*monthly_unpaid_balance 

    balance = remaining_balance_recur(monthly_unpaid_balance, annualInterestRate, monthlyPaymentRate, month + 1) + interest 

    print ("Remaining balance " + str(round(balance,2))) 
+0

インデントを修正しましたか?あなたのコードはコンパイルされません。 –

答えて

0

私がきた最善の方法を家庭教師必要再帰に対処するために見つかったのは、基本ケースを指定することから始めることです。あなたの方法を終えたときにあなたに伝える条件は何ですか?あなたは月> 12' `まで、あなたの方法を実行するようにあなたのコードでは、それはそう、あなたのベースケースは次のようになり、見える:あなたのベースケース用

if month > 12: 
    return 1 # 1 for the purpose of explanation 

あなたの戻り値は、あなたの関数のいくつかの基本値です。あなたの月が12歳だったらあなたのスクリプトは何を返しますか?それがあなたが返す価値です。

次は難しい部分です。あなたのメソッドへのその後の呼び出しで、どの変数が変更されているのか把握する必要があります。あなたのコードが意図していることを正確にはわかりませんが、いくつかの変数についていくつかの計算があるようです。再帰を使用すると、実行中の現在のメソッド呼び出しの状態を保存していて、ステートメントに必要な値を取得しているかのようになります。 (例:a_num = 1 + recurse(n - 1) - このステートメントを続行するには、recurse(n - 1)の値が必要ですが、これは一例です)。あなたの以前の反復によって影響を受けた変数を探し、その反復を試みてください。あなたは再帰的なメソッドを記述する場合

balance = balance + remaining_balance_recur(annualInterestRate, monthlyPaymentRate, month + 1) 
return balance 

、あなたは常にメソッドの最後にいくつかの値を返す必要があり、そのメソッドを呼び出したステートメントが実際に取得します。balanceが変数ということであるようにあなたの状況では、それが見えます値。

これらのヒントからコードの再帰的解を見つけようとしてください。申し訳ありませんが、再帰は特にSOを説明することは非常に難しいです。 YouTubeのvidsとGoogleは、一般的な再帰を理解するのにも大きな助けになるでしょう。これはあなたにいくつかのアイデアを与えたがっていますように

0

while文の前に "month = 1"を入れると、月< = 12が永遠に実行されるように、それをリセットします。これは、 "RecursionError:最大再帰深度を比較して超えました"を作成します。

関数の出力は、intまたはfloatを返すのではなくprint文であるため、現在は "NoneType"です。あなたの再帰のNoneType(印刷された文)に浮動小数点(金利)を追加しようとしたので、これは "TypeError"を生成します。

関連する問題