かんたん合格 基本情報技術者予想問題集をお持ちのへ

午前試験免除制度対応!基本情報技術者試験のeラーニング【独習ゼミ】
マナさん  
(No.1)
『かんたん合格 基本情報技術者予想問題集 令和5年度』をお持ちの方に質問です。

科目B 予想問題②の問4が解説を読んでも解らず困っています。
プログラム1のfactの繰り返し回数は分かるのですが、それと他のプログラム2、3との結びつきが分かりません。また、プログラム2、3が何故答えの回数になるのか理解できません。
プログラム2の実行結果はfact(5)/fact(3)の商なのですが、何故3回になるのかが分かりません。

考え方が間違っているとは思うのですが、もしお分かりになる方いましたら教えていただけると嬉しいです。よろしくお願いします。
2023.05.30 20:52
milchmanさん 
(No.2)
P.156の「合格のカギ」部分にあるとおり、combinationがpermutationとfactを呼び出す順番になるので、プログラム3→プログラム2→プログラム1の順に見ていくことになるのだと思います。

問題文に「combination(5,2)のように呼び出したとき、」とあるので、最初にプログラム3に進みます。
このとき、n=5、r=2です。
プログラム3の4行目でnとrの数字を入れて、
---
ret ← permutation(5,2)÷fact(2)の商
---
となり、permutationが呼び出されたのでプログラム2の4行目が
---
ret ← fact(5)÷fact(5-2)の商
---
となり、factに関してプログラム1でそれぞれ値を出していく形になると思います。

プログラム2の4行目がfact(5)÷fact(3)になる理由は、fact(n-r)=fact(5-2)=fact(3)だからです。

問われているのはプログラム1の5行目の実行回数なので、fact(5)とfact(3)とfact(2)で必要となる実行回数を足して解答となります。
2023.05.31 05:46
マナさん  
(No.3)
milchmanさん 

丁寧に説明いただきありがとうございます。
理解がまだ完璧ではないのですが、そもそもプログラム1から順番に考えていることが間違いだと分かりました!
プログラム3→2→1とトレースしていって、fact(〇〇)の括弧の中を合計した数が答え、と理解しました(間違っていたらごめんなさい…)。

もう一回問題とか直してみます。ありがとうございます!
2023.05.31 18:47
ベベノさん 
(No.4)
マナさんの理解でトレースの順番は合っているのですが、回答の求め方が違うかもしれません。
今回のプログラムではプログラム1の5行目はfact()に入る数字の回数だけ実行されますが、ifなどで分岐があった場合はそうではなくなります。(この点を理解しているようであれば、下記はただのお節介です)

【combination()の処理】
プログラム3を使用します。
今回の(5,2)を入れると、permutation(5,2)とfact(2)が出てくるので、これを実行して答えを求めなければ進めません。

【permutation()の処理】
プログラム2を使用します。
(5,2)を入れると、fact(5)とfact(3)が出てくるので、これも実行する必要があります。

【fact()の処理】
プログラム1を使用します。
今まで出てきたfact(5)とfact(3)とfact(2)をそれぞれ実行する必要があります。
トレースすると今回問われている行を、fact(5)は5回、fact(3)は3回、fact(2)は2回使用することになります。

あとは必要な値をそれぞれに返して続きを実行すればいいので、もうプログラム1は使用しません。

全体で求める行が使われたのは5+3+2=10回です。
※今手元にテキストがないので、実行回数が間違っていたらすみません

説明がわかりにくかったら申し訳ないです。
2023.06.02 17:07
boyonboyonさん 
FE シルバーマイスター
(No.5)
最近、問題集に関する質問をよく見かけます。
問題集を持っていない身としては、内容がよく分からず、返信できないでいましたが、こちらの質問は、投稿されている内容から問題を予想しましたので、書き込みさせていただきます。
的外れでしたらご容赦ください。

fact(n){
ret←1
for(i=n,i>0,-1)
ret←ret*i
endfor
return(ret)
}

permutation(n,r){
ret←fact(n)/fact(n-r)
return(ret)
}

combination(n,r){
ret←permutation(n,r)/fact(r)
return(ret)
}

のようなプログラムだと思いますがいかがでしょうか。
そうであれば、これは順列と組み合わせをプログラムしたものです。
(関数名もそのままなので)
factは、階乗(factorial)ですね。

問題は、「ret←ret*iが、何回実行されるか」ですか?
n!を計算するので、ループの回数は、nになります。
combinationとpermutationは、
nCr=n!/{r!(n-r)!}
nPr=n!/(n-r)!
を表しています。

こんなことを考えながら問題に取り組むと理解しやすいんじゃないかなと思います。
2023.06.02 20:43
boyonboyonさん 
FE シルバーマイスター
(No.6)
失礼しました。
nCr=nPr/r!
で表されていました。
2023.06.02 20:51
マナさん  
(No.7)
御礼が遅れて申し訳ありません!

→ベベノさん
トレース順はあってましたが、指摘いただいた内容がまんまと理解できていませんでした…。凄く凄く分かりやすいです。ありがとうございます!
『あとは必要な値をそれぞれに返して続きを実行すればいいので、もうプログラム1は使用しません。』
↑がストン!と腑に落ちました。


→boyonboyonさん
予想、と仰っていますが凄いです。設問の内容ほぼあっております…!
combinationとpermutationは、
nCr=n!/{r!(n-r)!}
nPr=n!/(n-r)!
こちらの記載、とても考えやすいです。
ありがとうございます!あ、こういう流れをしてたのかと分かりました!!
2023.06.07 21:56

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。

その他のスレッド


Pagetop