68870


javascriptで下記の再帰処理プログラムを書いたのですが、なぜ動作するのか分りません。  
restに入る配列がheadに代入されて行くのですが、配列の値が無くなり最後はundeindで空の配列が帰ってきそうなのですが、２倍された配列が帰って来て不思議です。どのような動作をしているのでしょうか？

[code]

    const numbers = [1,2,3];
     
    function double([ head, ...rest ]) {
        console.log(head);
        if (!head) { return []; }
    
        return [ 2 * head, ...double(rest) ];//rest[2, 3]がhead, ...restに分割されて入る
        // [2 * head = 1, 2 * head = 2, 2 * head = 3, ここにこずreturn 2 * head = undefind]
    }
    
[/code]

**追記**  
処理の流れを自分なりに解釈してみたのですが、やはり最後に空のリストが追加されそうな気がします。

[1, 2, 3]と配列があって分割代入になり  
最初の処理1

[code]

    head = 1, [2, 3]
    [2 * 1, ...double([2, 3])]
    
[/code]

ここでreturnより先に関数が実行され最初に戻る。  
処理2

[code]

    head = 2, [3]
    [2（最初に出る2）, 2 * 2, ...double([3])]
    
[/code]

処理3

[code]

    head = 3, []
    [2, 4, 2 * 3, ...double([])]
    
[/code]

処理4 if文でreturn []が返される。

[code]

    [2, 4, 6, []]/こうなりそうだけどならないのが不思議です。
    
[/code]


CC BY-SA 4.0
2020-07-23T14:41:33.617
68866
2020-07-24T05:42:14.990
2020-07-24T05:42:14.990
22565
22565
question
javascript
javascriptでのrestを使用した再帰処理について

[code]

    if (!head) { return []; }
    
[/code]

で`head`が`undefined`の場合は空の配列を返しているので

[code]

    double([1, 2, 3])
      double([2, 3])
        double([3])
           dobule([])
           // []
        // [2 * 3, ...[]] = [6]
      // [2 * 2, ...[6]] = [4, 6]
    // [2 * 1, ...[4, 6]] = [2, 4, 6]
    
[/code]

といったところでしょうか？

P.S. undefindではなくundefined，未定義です


CC BY-SA 4.0
2020-07-23T15:58:45.377
68870
2020-07-23T15:58:45.377
2376
68866
answer