TransWikia.com

javascriptでのrestを使用した再帰処理について

スタック・オーバーフロー Asked by wataru on October 6, 2020

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

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]
}

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

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

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

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

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

処理3

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

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

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

One Answer

if (!head) { return []; }

headundefinedの場合は空の配列を返しているので

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]

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

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

Answered by hinaloe on October 6, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP