大滝本4.9
焼肉さん
(No.1)
科目bについて大滝本を使用されている方にご質問です。4.9逆ポーランド表記方の回答が理解できません。
なぜ、
a = y
b = x
なのでしょうか。
1、2の順でキューにスタックされるので2がxに代入されるべきと考えているのですが、、、
何故だか理由をご教示いただける方いらっしゃいますか?
なぜ、
a = y
b = x
なのでしょうか。
1、2の順でキューにスタックされるので2がxに代入されるべきと考えているのですが、、、
何故だか理由をご教示いただける方いらっしゃいますか?
2024.10.31 13:33
きはらさん
(No.2)
逆ポーランドは、例えば(1,2,+)の場合、1+2となります。2+1ではありません。取り出される順番は後ろからなので、1つめはyに代入されるのだと思います。
2024.10.31 13:47
焼肉さん
(No.3)
きはらさん
コメントありがとうございます。
私の書き方が悪かったと思います。
減算や除算も考慮する必要があります。
x + y
x - y
そのため(1、2、+)の場合、
1が最初にスタックされて、2がその次にスタックされる認識ですが、
最初にpopするのは2になるので x = 2 となるべきと思っているのですが、
何か何処かで考え方が違うんでしょうね。。。
コメントありがとうございます。
私の書き方が悪かったと思います。
減算や除算も考慮する必要があります。
x + y
x - y
そのため(1、2、+)の場合、
1が最初にスタックされて、2がその次にスタックされる認識ですが、
最初にpopするのは2になるので x = 2 となるべきと思っているのですが、
何か何処かで考え方が違うんでしょうね。。。
2024.10.31 14:47
きはらさん
(No.4)
こちらこそ説明が下手で申し訳ありません。
(1,2,3)の場合、スタックに格納(push)される順番は1→2→3、取り出す(pop)順番は3→2→1かと思います。
(1,2,+)のとき、最初にpopされる2がxに代入された場合、yには1が代入されるかと思います。x+yに当てはめると、2+1となってしまいます。なので、yには2が代入されるのかと思います。
(1,2,3)の場合、スタックに格納(push)される順番は1→2→3、取り出す(pop)順番は3→2→1かと思います。
(1,2,+)のとき、最初にpopされる2がxに代入された場合、yには1が代入されるかと思います。x+yに当てはめると、2+1となってしまいます。なので、yには2が代入されるのかと思います。
2024.10.31 15:12
QMさん
★FE ゴールドマイスター
(No.5)
大滝本は持っていないので、正確な状況は分かりませんが。
(1, 2, +) は「1に2を足す」という意味だという、これは定義として納得してもらうしかないかと。
足し算だとどちらでも成立してしまうので、(4, 2, -) は「4から2を引く」の意味である、のほうがいいかな? ちょうど日本語の自然な語順になるんですよね。
で、その定義に合わせるために、先にpopされるほうをyに入れる。
(1, 2, +) は「1に2を足す」という意味だという、これは定義として納得してもらうしかないかと。
足し算だとどちらでも成立してしまうので、(4, 2, -) は「4から2を引く」の意味である、のほうがいいかな? ちょうど日本語の自然な語順になるんですよね。
で、その定義に合わせるために、先にpopされるほうをyに入れる。
2024.10.31 16:19
焼肉さん
(No.6)
きはらさん、QMさん
ご説明いただきありがとうございます。
仰られていることは理解しているつもりなのですが、、、やはりこの問題は理解ができませんでした。
(1,2,+)の場合
※前段にkに入る数値の判定があります
1の時 k = 1
2の時 k = 2
+の時 k = 10
if (k ≧ 0 and k ≦ 9)
rpnStack.push(k)
else
a ⇦ rpnStack.pop()
b ⇦ rpnStack.pop()
if (k = 10)
rpnStack.push(x + y)
if (k = 10)
rpnStack.push(x - y)
まず、1⇨2という順でスタックされるので、popする際は2⇨1になると理解しています。
この辺りはご説明いただいた内容と齟齬はないはずです。
そのため、最初にpopされるであろう2については x
次にpopされる1については y
と考えました。
ただ、問題の答えとしては、以下になります。
a = y
b = x
何が違うのか理解ができていません。。。
ご説明いただきありがとうございます。
仰られていることは理解しているつもりなのですが、、、やはりこの問題は理解ができませんでした。
(1,2,+)の場合
※前段にkに入る数値の判定があります
1の時 k = 1
2の時 k = 2
+の時 k = 10
if (k ≧ 0 and k ≦ 9)
rpnStack.push(k)
else
a ⇦ rpnStack.pop()
b ⇦ rpnStack.pop()
if (k = 10)
rpnStack.push(x + y)
if (k = 10)
rpnStack.push(x - y)
まず、1⇨2という順でスタックされるので、popする際は2⇨1になると理解しています。
この辺りはご説明いただいた内容と齟齬はないはずです。
そのため、最初にpopされるであろう2については x
次にpopされる1については y
と考えました。
ただ、問題の答えとしては、以下になります。
a = y
b = x
何が違うのか理解ができていません。。。
2024.10.31 18:26
QMさん
★FE ゴールドマイスター
(No.7)
> そのため、最初にpopされるであろう2については x
> 次にpopされる1については y
> と考えました。
「最初にpopされる値」と「x」をつなげるところに飛躍があります。
取り出した値を入れる変数は x, y の順に使う、とはどこにも書いていませんよね?
(x, y, +) は、x + y と計算しなければなりません。
pop では後ろの y のほうが先に出てくるので、先に出てきた値は y に入れるべきものです。
2024.10.31 19:57
きはらさん
(No.8)
問題では、
rpnStack.push(x + y)
の通りxとyの順番が決められています。もし問題がy+xであればそれに合わせた代入のやり方になります。また、プログラムは上から下に流れていくので、
y ⇦ rpnStack.pop()
の処理を先にするはずです。ここでpopされるのは2となります。
x+y
1+2
このような形にしたいので、2はyに代入します。
rpnStack.push(x + y)
の通りxとyの順番が決められています。もし問題がy+xであればそれに合わせた代入のやり方になります。また、プログラムは上から下に流れていくので、
y ⇦ rpnStack.pop()
の処理を先にするはずです。ここでpopされるのは2となります。
x+y
1+2
このような形にしたいので、2はyに代入します。
2024.11.01 08:56
私も11月に受けますさん
(No.9)
正確な問題文は存じ上げませんが、問題がキューなのかスタックなのかの違いではないでしょうか。質問文にはキューにスタックと使われていました。
質問者様が想定されているのはスタックになります。
キューの場合は先に入れたものが先に出てきますので、ポップされる順番としては1→2となります。
質問者様が想定されているのはスタックになります。
キューの場合は先に入れたものが先に出てきますので、ポップされる順番としては1→2となります。
2024.11.01 14:13
QMさん
★FE ゴールドマイスター
(No.10)
> 質問文にはキューにスタックと使われていました。
pushとpopを使っているので、スタックの話でいいと思いますよ。
最初にpopされる値はxに入れる、と決めつけているところが問題です。
(1, 2, +) を 1 + 2 になるように x + y に入れたいのです。
ここをスレ主さんは理解できているでしょうか?
(1, 2, -) なら 1 - 2 にしたいのです。
2をxに、1をyに入れたら、2 - 1 になります。これは間違いですよね?
やりたいことに合わせてアルゴリズムを決めるのであって、
トレースしてみて期待している結果にならないならば、
それは正しいアルゴリズムではありません。
2024.11.01 17:20
アルゴさん
(No.11)
P154の引き算の図で説明すると
(2, 1, -)の場合
「2,1」の順番でPUSH(スタックの図)し
「1,2」の順番でPOPしているので
変数の値は、
Y=1、X=2で、X - Y = 1になります。
逆に代入してしまうと
X=2、Y=1で、X - Y = -1のため、計算結果が誤っています。
逆ポーランドの問題でトレースする場合は、
「足し算、掛け算」でトレースすると
XとYが逆でも同じ結果になってしまいますので
計算順番で結果が変わる「引き算、割り算」でトレースする方法が良いと思います。
(2, 1, -)の場合
「2,1」の順番でPUSH(スタックの図)し
「1,2」の順番でPOPしているので
変数の値は、
Y=1、X=2で、X - Y = 1になります。
逆に代入してしまうと
X=2、Y=1で、X - Y = -1のため、計算結果が誤っています。
逆ポーランドの問題でトレースする場合は、
「足し算、掛け算」でトレースすると
XとYが逆でも同じ結果になってしまいますので
計算順番で結果が変わる「引き算、割り算」でトレースする方法が良いと思います。
2024.11.01 17:48
焼肉さん
(No.12)
返信が遅くなり申し訳ございません。
皆様、ご説明・コメントいただきありがとうございます。
ここで大切なのは、最初にpopしたものを y、次に取り出したものを x に代入することだと
理解しました。問題文では正しく計算できる(誤りのない)式のみを扱うものとするとあったので
答えが負の数になるのはNGと思い込んでましたが、そもそもその認識が誤りなのかなと思いました。
色々とご教示いただき本当にありがとうございました。
明日受験してきます!
皆様、ご説明・コメントいただきありがとうございます。
ここで大切なのは、最初にpopしたものを y、次に取り出したものを x に代入することだと
理解しました。問題文では正しく計算できる(誤りのない)式のみを扱うものとするとあったので
答えが負の数になるのはNGと思い込んでましたが、そもそもその認識が誤りなのかなと思いました。
色々とご教示いただき本当にありがとうございました。
明日受験してきます!
2024.11.01 23:43
広告
返信投稿用フォーム
投稿記事削除用フォーム
広告