スタック・オーバーフロー 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, []]/こうなりそうだけどならないのが不思議です。
if (!head) { return []; }
でhead
がundefined
の場合は空の配列を返しているので
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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP