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

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

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

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

Q&A

解決済

3回答

325閲覧

javascriptの関数内から自分を呼び出すことは可能か

MasakazuFukami

総合スコア1869

JavaScript

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

1グッド

0クリップ

投稿2017/11/29 02:47

いつもお世話になっております。

ふと、階乗の計算をサクッとやりたいなと思って書いてみました。

js

1// 再帰 2const factorial = (n) => { 3 if(n === 1) {return 1} 4 return n * factorial(n - 1) 5} 6 7factorial(10) => 3628800

しかし、結局自分を呼び出しているので、その辺をいい感じに省略できないかなぁと思いました。
イメージとしては以下の感じです。

js

1((n) => { 2 if(n === 1) return 1; 3 return n * self(n - 1) //selfの部分がなんとかならないか...! 4})(10)

もしご存じの方がいたらご教示お願いいたします。
また、出来ない場合は詳しく調べてみたいので、用語?でこういう呼び出しが出来ないことをなんというかご教授いただけると幸いです。。。

defghi1977👍を押しています

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

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

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

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

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

defghi1977

2017/11/29 02:50

javascript caller callee周りが多分それ
guest

回答3

0

ベストアンサー

いちばん手っ取り早いのは、従来の関数リテラルを使うことかもしれません。

javascript

1(function factorial(n){ 2 // 0! = 1にも対応 3 if(n === 0) {return 1} 4 return n * factorial(n - 1) 5}(10));

なお、かつては自分自身を指す名前としてarguments.calleeが存在しましたが、strictモードでは使えません。あと、不動点演算子を使うことで名前をつけないまま再帰するような技法もありますが、余計に面倒です。

投稿2017/11/29 02:54

maisumakun

総合スコア145183

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

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

yambejp

2017/11/29 03:07

> strictモードでは使えません なるほど、strictでテストしてみて結果が導けないのでどうしたものかと思ったんですが 使えないんですね・・・
miyabi-sun

2017/11/29 03:49

色々悩んだ結果これにたどり着きました。 factorialを縮めてfnにして一応if文の箇所こんな感じに包めば1〜2行で書けますが、 オフトピ気味なのでこのコメントにぶら下げます。 `return (n <= 1) ? 1 : n * fn(n - 1);`
maisumakun

2017/11/29 03:53

それどころか、アロー関数ではarguments自体が使えなくなっています(可変個の引数を取りたいならspreadで書く必要があります)。
guest

0

名前付きの関数にするとか。

JavaScript

1(function self(n) { 2 if(n === 1) return 1; 3 return n * self(n - 1) 4})(10)

追記:

無理にアロー関数を使ってみた。

JavaScript

1let self; 2console.log( ( self = n=> ( n < 2 ) ? 1 : n * self( n - 1 ) )( 10 ) ); 3```**動くサンプル:**[https://jsfiddle.net/aokdqt7b/](https://jsfiddle.net/aokdqt7b/)

投稿2017/11/29 02:51

編集2017/11/29 13:11
kei344

総合スコア69400

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

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

0

再起表現といえば悪名高いcalleeの出番でしょう

javascript

1 2var num=(function(n){ 3 return n===1?1:n * arguments.callee(n - 1); 4})(10) 5console.log(num);

投稿2017/11/29 03:02

yambejp

総合スコア114784

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問