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

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

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

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

基本情報技術者

基本情報技術者とは、経済産業省が行う国家資格「情報処理技術者試験」の区分の一つです。試験ではプログラマーやシステムエンジニアなどIT業界で働くために必要とされる基礎知識や情報処理において論理的な考え方ができるか等が問われ、企業から高い評価を獲ることができ、IT業界の入門的な資格として人気があります。

Q&A

解決済

3回答

1006閲覧

なぜTrueとFalseを判定出来るのかわからない。

Ryota0918

総合スコア15

Python

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

基本情報技術者

基本情報技術者とは、経済産業省が行う国家資格「情報処理技術者試験」の区分の一つです。試験ではプログラマーやシステムエンジニアなどIT業界で働くために必要とされる基礎知識や情報処理において論理的な考え方ができるか等が問われ、企業から高い評価を獲ることができ、IT業界の入門的な資格として人気があります。

0グッド

0クリップ

投稿2021/05/23 22:49

基本情報技術者試験に向けて勉強中です。
Pythonで、Google Colaboratoryにて実施したプログラムです。

基本情報技術者試験の問題はこちらです。

問題ではC言語で出題されたようですが、勉強のためPythonで取り組んでいます。
参考書を読んでプログラム全体をトレースしても、なぜTrueとFalseを判定出来るのか理解ができずに質問させていただきました。

下記において、

exists_at(i//p_rn, j//p_cn,d-1)==0:

こちらの式でTrueとFalseをなぜ判定できるのか、理解が出来ませんでした。

例えば、
exists_at(0, 0, 1)==0はFalseになります。
exists_at(1, 1, 2)==0はTrueになります。

pat=[[1,1],[1,0]] p_rn=len(pat) p_cn=len(pat[0]) def print_frac(d): rn=cn=1 for i in range(d): rn *= p_rn cn *= p_cn for i in range(rn): for j in range(cn): print('*' if exists_at(i,j,d) else " ",end=" ") def exists_at(i,j,d): if d == 0: return 1 elif exists_at(i//p_rn, j//p_cn,d-1)==0: return 0 else: return pat[i%p_rn][j%p_cn]

教えていただけますと幸いです。

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

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

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

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

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

guest

回答3

0

ベストアンサー

再帰関数の動きを理解したければ、print文を入れて見るのが分かりやすいです。

python

1>>> pat=[[1,1],[1,0]] 2>>> p_rn=len(pat) 3>>> p_cn=len(pat[0]) 4>>> 5>>> def exists_at(i,j,d): 6... print(f'i = {i}, j = {j}, d = {d}') 7... if d == 0: 8... return 1 9... elif exists_at(i//p_rn, j//p_cn,d-1)==0: 10... return 0 11... else: 12... return pat[i%p_rn][j%p_cn] 13... 14>>> exists_at(0, 0, 1) 15i = 0, j = 0, d = 1 16i = 0, j = 0, d = 0 171 18>>> exists_at(1, 1, 2) 19i = 1, j = 1, d = 2 20i = 0, j = 0, d = 1 21i = 0, j = 0, d = 0

投稿2021/05/23 23:16

ppaul

総合スコア24666

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

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

Ryota0918

2021/05/24 14:49

ありがとうございます。 再帰関数であること、そしてその動きを理解できていなかったのだと分かりました。ありがとうございます!
guest

0

exists_at関数がどういう値を返すか、を考えればいいかと思いますが
0を返すのであれば、 0==0 となってこれはtrue となりますが、
0以外を返すのであれば、falseとなります

投稿2021/05/23 23:13

y_waiwai

総合スコア87774

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

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

Ryota0918

2021/05/24 04:51

コメントありがとうございます。 0を返せばTrue、0以外であればFalseまでは理解できているのですが、 なぜあの式に値を入れると0でTrueになったり、0以外でFalseになるのか、根本的には値によってなぜ出力される値に差が生じるのか、そこが理解できず困っています。 もしかするとすごく単純なことなのかもしれませんが、、
y_waiwai

2021/05/24 07:29

なにがわからないのかちとわかりませんが、 その式の結果はどうなるんでしょうか
guest

0

ここに書いてあります。

6. 式 (expression) — Python 3.9.4 ドキュメント

ブール演算のコンテキストや、式が制御フローの文で使われる際には、次の値は偽だと解釈されます: False 、 None 、すべての型における数値の 0、空の文字列、空のコンテナ (文字列、タプル、リスト、辞書、集合、凍結集合など)。 それ以外の値は真だと解釈されます。

追記 exists_at(0, 0, 1) が非 0 になる理由

Python

1def exists_at(i,j,d): 2 if d == 0: 3 return 1 4 elif exists_at(i//p_rn, j//p_cn,d-1)==0: 5 return 0 6 else: 7 return pat[i%p_rn][j%p_cn]

exists_at(0, 0, 1) を呼ぶと d は 0 でないため、exists_at(i//p_rn, j//p_cn,d-1)==0 が評価されます。
ここに i, j, d を代入すると、exists_at(0, 0, 0) == 0 になります。
つまり exists_at(0, 0, 1) は、exists_at(0, 0, 0) == 0 の時に 0 を返し、そうでない時に pat[i%p_rn][j%p_cn] を返すということになります。

exists_at(0, 0, 0) を呼ぶと、d は 0 なので 1 になります。
つまり exista_at(0, 0, 0) == 0 ではないので、exists_at(0, 0, 1) の戻り値は pat[i%p_rn][j%p_cn] になります。
ここで i == 0, j == 0 なので、exists_at(0, 0, 1) は pat[0][0] つまり 1 が戻り値になります。

以上のように、exists_at(0, 0, 1) は 1 なので 0 ではありません。
そのため、exists_at(0, 0, 1) == 0 は False になります。

exists_at(1, 1, 2) も同様に計算してください。

投稿2021/05/23 22:54

編集2021/05/24 05:01
Zuishin

総合スコア28660

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

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

Zuishin

2021/05/23 23:24

> print('*' if exists_at(i,j,d) else " ",end=" ") 何が分からないか分からないからここの話をしてるのかと思ったけど、もしかしてもっと単純に「==」や「//」の意味がわからないという質問なんだろうか。
Ryota0918

2021/05/24 04:53 編集

コメントありがとうございます。 ==や//の意味は分かります。 ただ、なぜあの式に値を入れると0でTrueになったり、0以外でFalseになるのか、根本的には値によってなぜ出力される値に差が生じるのか、そこが理解できず困っています。 頂いたコメントを読んでもまだしっくりこなくて、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問