68478


Recursionについて学習中なのですが、わからない箇所があるので質問します。

**学習内容ページ:**  
[Basic JavaScript: Replace Loops using Recursion -
freeCodeCamp.org](https://www.freecodecamp.org/learn/javascript-algorithms-
and-data-structures/basic-javascript/replace-loops-using-recursion)

前提として、

>
[code]

>       function multiply(arr, n) {
>         var product = 1;
>         for (var i = 0; i < n; i++) {
>             product *= arr[i];
>         }
>         return product;
>       }
>  
[/code]

>
> しかし、 **`multiply(arr, n) == multiply(arr, n - 1) * arr[n - 1]`**
> なので、下記のように書き換えられる。
[code]

>       function multiply(arr, n) {
>         if (n <= 0) {
>           return 1;
>         } else {
>           return multiply(arr, n - 1) * arr[n - 1];
>         }
>       }
>  
[/code]

つまり、仮に

[code]

      function multiply(arr, n) {                               
        if (n <= 0) {                               
          return 1;                             
        } else {                                
          return multiply(arr, n - 1) * arr[n - 1];                             
        }                               
      }                             
    arr=[2,3,4,5,6,7];
    multiply(arr, 5);
    
[/code]

だとして、**n=5,4,3,2,1(arrの内容で言うと 6,5,4,3,2)を順番に処理し、  
elseのreturn値が`multiply(arr, n - 1) * arr[n - 1]; //6*5*4*3*2 = 720`
となったところでn=0に達し、最後は、returnされた1が代入されるので、`結果 720*1 ＝ 720` となるということでしょうか。

解釈は、これで正しいのでしょうか。

どなたか、お答えいただければ幸いです。  
どうぞよろしくお願いいたします。


CC BY-SA 4.0
2020-07-06T14:16:53.340
68346
2020-07-11T17:04:46.290
2020-07-11T17:04:46.290
3060
40891
question
javascript
再帰について、この解釈は正しいでしょうか


multiplyで行っている処理は、配列 arr の先頭から n 個の要素の積を返す関数です。  
つまり、返り値はarr[0]～arr[n-1]までの積となります。

[code]

    if arr = [2,3,4,5,6,7,8,9],
    multiply(arr, 5); equals 2*3*4*5*6  //arr[4]=6
    
[/code]

になります。  
上段multiply内のfor内でも i<n となっているのでarr[n-1]の要素までしかアクセスしていません。


CC BY-SA 4.0
2020-07-06T14:59:28.953
68347
2020-07-06T14:59:28.953
40962
68346
answer


・追加の質問について  
元の質問を消してしまうと、回答と意味が繋がらなくなるため推奨されません。  
なるべく追記する形にしたほうが良いです。

実行の流れとしては再起呼び出しのため、先にmultiplyの関数が展開され、  
multiply(arr,0)->1がreturnされたあと順次さかのぼって計算されていきます。  
イメージとしては下記のようになります。

[code]

    multiply(arr,5)
    ->multiply(arr,4)*6
      ->(multiply(arr,3)*5)*6
        ->((multiply(arr,2)*4)*5)*6
          ->(((multiply(arr,1)*3)*4)*5)*6      
            ->((((multiply(arr,0)*2)*3)*4)*5)*6
            ->((((1*2)*3)*4)*5)*6
          ->(((2*3)*4)*5)*6
        ->((6*4)*5)*6
      ->(24*5)*6
    ->120*6
    =720
    
[/code]


CC BY-SA 4.0
2020-07-10T16:03:08.223
68478
2020-07-10T16:03:08.223
40962
68346
answer