ここから本文です

c++の階乗を求めるプログラムについて int getFactorial(int number){ i...

kim********さん

2019/4/1007:52:47

c++の階乗を求めるプログラムについて

int getFactorial(int number){

int sum;
if(number == 1) sum = 1;
else sum = (getFactorial(number - 1) * number);
return sum;

numberが4の場合
4 - 1 = 3
3 × 4 = 12

まではわかるのですが

その次に
3 - 1 = 2

12 × 2
となるのはなぜですか?

閲覧数:
45
回答数:
5

違反報告

ベストアンサーに選ばれた回答

k02********さん

2019/4/1008:34:26

プログラムはmain()を書く。
int getFactorial(int number){
int sum;
if(number == 1) sum = 1;
else sum = (getFactorial(number - 1) * number);
return sum;
}
int main()
{
int x,y;
x=4;
y=getFactorial(x);
printf("%d \n",y);
return 0;
}

以下メモリ上(例 #アドレス)
#8000 x = 4
#7ffC y =24

getFactorial(4)=24
#7ff8 number = 4 引数
#7ff4 (return アドレス)
#7ff0 sum =4*6=24

getFactorial(3)=6
#7fEC number = 3 引数
#7fE8 (return アドレス)
#7fE4 sum =3*2=6

getFactorial(2)=2
#7fE0 number = 2 引数
#7fDC(return アドレス)
#7fD8 sum =2*1=2

getFactorial(1)=1
#7fD4 number = 1 引数
#7fD0(return アドレス)
#7fCC sum =1

ベストアンサー以外の回答

1〜4件/4件中

並び替え:回答日時の
新しい順
|古い順

prw********さん

2019/4/1009:13:15

>その次に 3 - 1 = 2 12 × 2 となるのはなぜ

これは「なぜ」ではなしに、そういう計算になるように再帰の文法を調整しました

まずは「そのような計算結果になるべきだ」との理想があって、次に再帰の文法が作られました

強いて「なぜ」かと言えば、そのようになるように文法を作ったからです

「これらの計算結果を表す書き方がプログラミングでの再帰の書き方である」というように、再帰の文法を調整したものが、今習っている再帰の書き方です

なので、「なぜ」というものではなく、再帰の書き方は「そのような意味になるように読み解いて欲しい」という全く逆の側面からの説明が可能です

***

本質的には、(記号論的には)再帰の表現方法には意味が無いからです

意味は全部後付けだからです

人為的なものであればあるほど、意味は後付けになります

nic********さん

2019/4/1008:39:42

C++で、階乗を求めるプログラムを作る場合は、Boost.Multiprecisionのcpp_int型といった多倍長整数を取り扱うライブラリを使えば100の階乗も求めることができます。

以下をご覧ください。

[組み込み型のint型の場合]
0!:1
1!:1
2!:2
3!:6
4!:24
5!:120
6!:720
7!:5040
8!:40320
9!:362880
10!:3628800
11!:39916800
12!:479001600
13!:1932053504
14!:1278945280
15!:2004310016
16!:2004189184
17!:-288522240
18!:-898433024
19!:109641728
20!:-2102132736
----
[Boost.Multiprecisionのcpp_int型の場合]
0!:1
1!:1
2!:2
3!:6
4!:24
5!:120
6!:720
7!:5040
8!:40320
9!:362880
10!:3628800
11!:39916800
12!:479001600
13!:6227020800
14!:87178291200
15!:1307674368000
16!:20922789888000
17!:355687428096000
18!:6402373705728000
19!:121645100408832000
20!:2432902008176640000

組み込み型のint型の場合は、12の階乗までしか計算できていますが、13の階乗以降はオーバーフローによりおかしくなっていますね。
ところがBoost.Multiprecisionのcpp_int型の場合は、20の階乗まできちんと計算できているのがわかります。
つまり、多倍長整数を取り扱うライブラリを使えば、100の階乗もきちんと計算できます。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

プロフィール画像

カテゴリマスター

aki********さん

2019/4/1008:08:56

numberが4の場合
4 - 1 = 3
3 × 4 = 12
まではわかるのですが

いえ、そうはなりません。
numberが4の場合される計算は
sum = (getFactorial(number - 1) * number);
ですから、
4 - 1 = 3
getFactorial(3) * 4 = ?
です。

getFactorial(3)の値が出るまで答えはわかりませんので、
値を知るために、getFactorial(3)が呼び出されます。

呼出されたgetFactorial(3)の中では、number=3です。
同じ式に従って
(number - 1) = 3-1 = 2
getFactorial(2) * 3 = ?
になりますが、その計算の為には、getFactorial(2)の値を知る必要があります。

そして、getFactorial(2)が呼び出され……と続いてゆきます。

getFactorial(1)になった時に、やっとreturn 1をされるので、
getFactorial(1)=1となり、

getFactorial(2)の中にある
getFactorial(1) * 2 の答えが
1 * 2 = 2であると判ります。
そしてこれが、getFactorial(2)の値となります。
あとはこの繰り返しで最初まで戻るとすべての計算結果が出ます。

her********さん

2019/4/1008:03:36

ちょっと順番が違うかな・・・

関数再起呼び出し
4 - 1 = 3
3 - 1 = 2
2 - 1 = 1
ここからリターン
1 * 2 = 2
2 * 3 = 6
6 * 4 = 24

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる