こんにちは
前に再帰について質問したのですが曖昧で分かったつもりになっていたようです。ネットで調べるとwhileで書かれたものとそれが解説サイト載っていたのですが、考えてもわかりません。
lang
1function factorial(num) 2{ 3 // If the number is less than 0, reject it. 4 if (num < 0) { 5 return -1; 6 } 7 // If the number is 0, its factorial is 1. 8 else if (num == 0) { 9 return 1; 10 } 11 // Otherwise, call this recursive procedure again. 12 else { 13 return (num * factorial(num - 1)); 14 } 15} 16 17var result = factorial(8); 18document.write(result); 19 20// Output: 40320
whileで書かれたもの
lang
1function factorial(num) 2{ 3 // If the number is less than 0, reject it. 4 if (num < 0) { 5 return -1; 6 } 7 // If the number is 0, its factorial is 1. 8 else if (num == 0) { 9 return 1; 10 } 11 var tmp = num; 12 while (num-- > 2) { 13 tmp *= num; 14 } 15 return tmp; 16} 17 18var result = factorial(8); 19document.write(result); 20 21// Output: 40320 22
while (num-- > 2)の間の処理のtmp = numはtmp=tmpnumですが
while(num-- > 2)の前の一行var tmp = num;
tmp = num;はnum--なのでtmp = 77になりtmp=49
その後496、その結果5、その結果4、その結果3でその後numが2になるのでwhileから抜け出しtmp = その結果*3を返すのではないのでしょうか?
しかしやってみると計算結果が合わなかったので最初のtmp = 77を87にしてみると合いました。
そこで疑問なのですが、whileの前のvar tmp = num;とwhile (num -- > 2)の8から1引いたnumは別物なんでしょうか?
そして返したtmp = 20160がどこに行くのかわかりません
個人的な推測ではこのサンプルの結果が40320なので20160を返したあとにnum--の結果numの2を呼び出し分岐させて、どれにもあわないので20160と掛け算をして終了なのかなと思うのですが、どうにも納得できません。
それ以前に変数に再代入した結果が変わるというのもどこでそうなっているのかが理解できてないのかもしれません
結局再帰も理解できてないのでしょうか?これは。
じぶんの頭の悪さに嫌気がさすのですが、好きなのでやってます
初歩的な質問なのですが教えてください
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。