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

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

新規登録して質問してみよう
ただいま回答率
85.48%
関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

808閲覧

pythonでの再帰を用いたユークリッドの互除法について

MZK

総合スコア2

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/11/24 11:36

再帰を用いたユークリッドの互除法について質問があります。
x,yにはそれぞれ
x = 123
y = 777
と代入されていると思います。一行目に出力される結果としては
123 0.1583...( = 123%777)
だと思ったのですが、
実際は
777 123
でした。
どうしてこのように入れ替わったのかが分からなかったので質問させて
頂きました。
よろしくお願いします。

python

1def calc(x,y): 2 if(y == 0): 3 return x 4 else: 5 print(str(y) + " " + str(x%y)) 6 print("--------------") 7 return calc(y, x % y) 8 9print(calc(123,777))

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

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

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

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

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

guest

回答2

0

入れ替わったのか

関数の呼び出しが 「calc(123,777)」なのに、 なぜ、「777 123」と表示されるかということだと思いますが、

まず、関数の定義では、仮引数 x, y で引数を受けますから、 x=123、 y=777 となっています。
これを出力するとき、 「print(str(y) + " " + str(x%y))」 のように yを先 に表示していますから、777が先に表示されるのです。
また、 別の回答のとおり、 % は商ではなく余りの計算なので、123%777 は 123となります。


おまけ

ユークリッドの互除法は、「大きい方を小さい方で割っていき、余りが0のときの小さい方が最大公約数」というものなので、 引数の大小を気にせずに計算できるようなプログラムを真面目に書くと、

python

1def calc(x,y): 2 if (x < y): 3 print('大小入れ替え') 4 calc(y, x) 5 elif(y == 0): 6 return x 7 else: 8 print(str(y) + " " + str(x%y)) 9 print("--------------") 10 return calc(y, x % y)

のように「大小が逆だったら入れ替えて計算する」という判定を入れるのです。

ところが、プログラムを動かしてみたりよく考えてみると、この大小判定を入れなくても最初の計算で大小が入れ替わることがわかるのです。 余りの計算で「小さい数 % 大きいすう = 小さい数」となることを利用しています。

ということで、質問のプログラムでは最初に行なうべき大小の判定を省いています。

投稿2022/11/24 12:33

TakaiY

総合スコア12743

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

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

MZK

2022/11/24 14:26

なるほど、、! コードもつけてくれてとても分かりやすかったです! ありがとうございます!
guest

0

ベストアンサー

%は余りをもとめる演算子で、123 % 777は123を777で割ったときのあまりなので、123 % 777 = 123です

投稿2022/11/24 11:46

dark-eater-kei

総合スコア1248

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

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

MZK

2022/11/24 12:25

確かに、、初歩的なことを忘れてました、、ありがとうございます!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問