質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

4回答

708閲覧

Pythonのコードで一部理解できない所があります。

amaturePy

総合スコア131

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1グッド

0クリップ

投稿2020/09/04 14:10

以下のPythonコードは引数として与えられた2つの数字を*を使わずにその2つの数字をかけた数字を出力するという物です。その中で期待通りの出力を出すコードを見つけたのですが、return a + multiple(a,b-1)この最後の行が何をしているのかが理解できません。
引数aに対して引数aと引数bから1を引いた物をたしている??のでしょうか??
基礎的な質問になり申し訳ありません。

def multiple(a,b): if b < 0: return -multiple(a,-b) elif b == 0: return 0 elif b == 1: return a else: return a + multiple(a,b-1) 【実行結果】 multiple(3,5) →15
y_shinoda👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/09/04 14:19

> 引数aに対して引数aと引数bから1を引いた物をたしている??のでしょうか?? 足しているのはaです。デバッグして1行1行どのような動きをしているのか確かめましょう。
meg_

2020/09/04 14:20

> その中で期待通りの出力を出すコードを見つけた 引用元を明示しましょう。
amaturePy

2020/09/05 02:39

必要な情報の足りてない質問になり、申し訳ありませんでした! 反省いたします。 引用元のURLなども明記しないと失礼でしたね。
guest

回答4

0

ベストアンサー

return a + multiple(a,b-1) この最後の行が何をしているのかが理解できません
引数aに対して引数aと引数bから1を引いた物をたしている??のでしょうか??

関数 multiple に引数 ab - 1 を与えた結果を
引数 a と加算して、結果を呼び出し元に返しています

該当の箇所は次のように書き換えても同様の動作となります:

python

1 result_multiple = multiple(a, b - 1) 2 result_sum = a + result_multiple 3 return result_sum

再帰呼び出しを理解するために

プログラムがどのような順番で動作するかを確認するために
次のように、print を追加して実行途中の変数を出力してみましょう:

python

1def multiple(a,b): 2 print("a=" + str(a) + ", b=" + str(b)) 3 if b < 0: 4 print("start case b < 0") 5 return_value = -multiple(a,-b) 6 print("finish case b < 0") 7 print("return_value=" + str(return_value)) 8 return return_value 9 elif b == 0: 10 print("start case b = 0") 11 return_value = 0 12 print("finish case b = 0") 13 print("return_value=" + str(return_value)) 14 return return_value 15 elif b == 1: 16 print("start case b = 1") 17 return_value = a 18 print("finish case b = 0") 19 print("return_value=" + str(return_value)) 20 return return_value 21 else: 22 print("start case b > 1") 23 return_value = a + multiple(a,b-1) 24 print("finish case b > 1") 25 print("return_value=" + str(return_value)) 26 return return_value 27 28#【実行結果】 29print(multiple(3,5))

実行結果:

console

1$ python test.py 2a=3, b=5 3start case b > 1 4a=3, b=4 5start case b > 1 6a=3, b=3 7start case b > 1 8a=3, b=2 9start case b > 1 10a=3, b=1 11start case b = 1 12finish case b = 0 13return_value=3 14finish case b > 1 15return_value=6 16finish case b > 1 17return_value=9 18finish case b > 1 19return_value=12 20finish case b > 1 21return_value=15 2215

投稿2020/09/04 15:27

y_shinoda

総合スコア3272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amaturePy

2020/09/05 04:20

ご丁寧例まで踏まえてのご説明ありがとうございます!! なるほど、そのように処理していくのですね。関数名(num1,num2)で乗法として処理されるのですね。こう言ったPythonの基本的な文法が抜けているのがかなり怖いです。地道に潰していきます。 また、今回の物に関しては基本的な数学的思考が抜けてると思い、もう少し深く考える必要があると実感しました。
guest

0

multipleの定義(def)で自分自身(multiple)を呼んでいますね。
このように定義された関数を「再帰関数」と呼びます。

再帰関数そのものについては、検索して調べてみてください。

a×b の計算の表わしかたはいろいろあって、「aをb個足す」のようなものや、この定義のような再帰的な定義もできてここでは以下のような定義を使っています。

  • 答= -(a * -b) {bが負の数のとき)
  • 答= 0 {bが0のとき}
  • 答= a {bが1のとき}
  • 答= a + (a * (b - 1)) {それ以外のとき}

投稿2020/09/04 14:49

TakaiY

総合スコア12825

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amaturePy

2020/09/05 04:48

ご丁寧なご説明ありがとうございます!! 再帰関数初めて聞きました!早速調べて見ました。あまり今まで見たことがないのは気のせいか、自分の知識量の無さから別の物と勘違いして間違って処理しているか少し不安です。。。また、この問題に関しては数学的考え方の段階で思考が足りなかったと思っています。 Python以前の問題ですね。。。
guest

0

乗算の定義そのものですね。

https://www.slideshare.net/taketo1024/ss-50882836 を51ページまで。

(本来は elif b == 1: 節は無用)

投稿2020/09/04 14:25

編集2020/09/04 14:26
quickquip

総合スコア11065

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

a × b = a + a × (b-1)という当たり前の式です。

投稿2020/09/04 14:15

otn

総合スコア84798

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問