@@ -269,7 +269,7 @@ if (box <= 30 && weight <= 2000) {
269269
270270## 6. バブルソート
271271
272- 引数に対して「バブルソート」という整列アルゴリズムを行い、整列済み配列を返す関数` bubbleSort() ` を書きます。
272+ 引数に対して「バブルソート」という整列アルゴリズムを行い、整列済み配列を返す関数` bubbleSort() ` を作成しましょう。< br />
273273そのアルゴリズムは次の通りです。
274274
275275- ソート前配列のある要素を取り、その一つ後ろの要素と比較する
@@ -320,28 +320,30 @@ function bubbleSort(array) {
320320
321321### <Term strong type =" javascriptReference " >参照</Term >と<Term strong type =" javascriptSideEffects " >副作用</Term >の話
322322
323- 本回答例では返り値をarrayに代入していないにも関わらず、arrayの中身が変わってしまいます。なぜでしょうか?<br >
323+ 本回答例では返り値をarrayに代入していないにも関わらず、arrayの中身が変わってしまいます。なぜでしょうか?<br / >
324324(参照の節)[../browser-apps/constant/#参照]で説明したように、これは配列が評価されたときにそれ自身ではなく、配列の<Term strong type="javascriptReference">参照</Term>が得られるからです。関数を実行したときに返り値以外に関数外部に影響を与えることを<Term strong type="javascriptSideEffects">副作用</Term>と呼び、<Term strong type="javascriptSideEffects">副作用</Term>を持たない関数を<Term strong type="javascriptPureFunction">純粋関数</Term>と呼びます。思わぬ<Term type="javascriptSideEffects">副作用</Term>を防ぐために共用の関数は<Term type="javascriptPureFunction">純粋関数</Term>であることが望ましいとされています。また関数のマクロ的役割である「操作のまとまり」として、<Term type="javascriptSideEffects">副作用</Term>である外部へのアクセス(画面への表示、インターネットのアクセス、ファイルの入出力など)をひとまとめにする場合は、専用の関数を作成し、それを明示すべきであるとされています。関数の引数以外の可変変数を参照することは<Term strong type="javascriptReferenceTransparency">参照透過性</Term>の妨げになり、デバッグが難しくなるといわれています。
325325上の関数を<Term strong type =" javascriptPureFunction " >純粋関数</Term >に書き直すと例えば、
326326
327327<Answer >
328328
329329``` diff javascript
330- + // swapIndexは純粋関数ではないが、あくまでモジュール化のプロセスでしかなく、外部では使わないので、予期せぬ副作用は発生しにくいためこのままでもよい
330+
331+ + /* swapIndexは純粋関数ではないが、あくまでモジュール化のプロセスであり、
332+ + 外部では使わないので、予期せぬ副作用は発生しにくいためこのままでもよい */
331333function swapIndex(array, indexA, indexB) {
332334 const temp = array[indexA];
333335 array[indexA] = array[indexB];
334336 array[indexB] = temp;
335337}
336- function bubbleSort(array) {
337- + let willResult = array.slice(); // 配列の値をコピー
338+ - function bubbleSort(array){
339+ + function bubbleSort(inputArray) {
340+ + let array = inputArray.slice(); // 配列の値をコピー
338341 for (let i = array.length - 1; i > 0; i--) {
339342 for (let j = 0; j < i; j++) {
340- + if (willResult[j] > willResult[j + 1]) swapIndex(willResult, j, j+1);
341- - if (array[j] > array[j + 1]) swapIndex(array, j, j+1);
343+ if (array[j] > array[j + 1]) swapIndex(array, j, j+1);
342344 }
343345 }
344- + return willResult ;
346+ + return array ;
345347}
346348```
347349
0 commit comments