質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

517閲覧

マージソートの関数の呼び出しと返り値について

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/07/20 00:29

編集2020/07/20 00:41

###発生している問題
Gitから拝借してきたソースコードです。
mergesort関数内でalignment(mergesort(left),mergesort(right));
の関数の呼び出しの仕組みかがわかりません。

また何故mergesort関数内でreturn mergeをする必要があるのでしょうか?
理屈を教えていただけないでしょうか...

###該当のソースコード

js

1let array = [23,55,78,19,4]; 2 3const mergesort = (array) =>{ 4 5 if(array.length<2){ 6 7 return array; 8 9 } 10  11 let middle = Math.floor(array.length/2); 12 let left = array.slice(0,middle); 13 let right = array.slice(middle,array.length); 14 15 const merge = alignment(mergesort(left),mergesort(right)); 16 console.log(`ソート後 ${merge}`); 17 return merge; 18 19} 20 21const alignment = (left, right) =>{ 22 23 let alignmentArray = []; 24 25 while(left.length && right.length){ 26 27 if(left[0] <= right[0]){ 28 29 alignmentArray.push(left.shift()); 30 31 }else{ 32 33 alignmentArray.push(right.shift()); 34 35 } 36 37 } 38 39 while(left.length){ 40 41 alignmentArray.push(left.shift()); 42 43 } 44 45 while(right.length){ 46 47 alignmentArray.push(right.shift()); 48 49} 50 51return alignmentArray; 52 53} 54 55console.log(`ソート前 ${array}`); 56mergesort(array); 57 58

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

FrontEnd_Japan

2020/07/20 00:34

こちらのコードはご質問者様が記述したものではなく、どこからか拝借したコードでしょうか。 であればその旨を記載していただけますと幸いです。
退会済みユーザー

退会済みユーザー

2020/07/20 00:42

記載しました。
guest

回答1

0

ベストアンサー

mergesort関数内でalignment(mergesort(left),mergesort(right));

の関数の呼び出しの仕組みかがわかりません。

ただ単に、同じ関数を呼んでいるだけです。JavaScriptでは、その関数自身を呼んでも特殊な対応が必要になることはなく、「たまたま同じ名前の関数を呼び出している」のと同様に動作します(ローカル変数も呼び出しごとに確保されます)。

また何故mergesort関数内でreturn mergeをする必要があるのでしょうか?

標準の.sort()は破壊的にソートするので返り値はなくても構わないのですが、このソート関数はコピーしてからソートしているので、ソート結果をreturnで返す構造になっています。

投稿2020/07/20 00:39

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/07/20 01:23

ありがとうございます。 ローカル変数も呼び出しごとに確保されるのですね! 再代入してるので値渡しのように見えてるのしょうか?
maisumakun

2020/07/20 01:24

> 再代入してるので値渡しのように見えてるのしょうか? どの部分についての話でしょうか?
退会済みユーザー

退会済みユーザー

2020/07/20 01:53 編集

``` let left = array.slice(0,middle); let right = array.slice(middle,array.length); ``` で何度も代入してるので値渡しのように見えてるのかなって... コピーするものと参照するものの違いが分からず..
maisumakun

2020/07/20 01:40

array.sliceは、切り出した「新しい配列」を返すメソッドです。元の配列は変化しません。
maisumakun

2020/07/20 01:46 編集

(このmergesort関数は、渡された引数のarrayを一切変更していない以上、渡し方は無関係です)
退会済みユーザー

退会済みユーザー

2020/07/20 02:02

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問