• ベストアンサー

クロージャは、再帰処理ではないのでしょうか?

クロージャの日本語訳は、再帰処理だと思っていたのですが、違うのでしょうか? 内側の関数から、外側の関数の変数を参照できればクロージャで、必ずしも再帰でなくてもよい?

質問者が選んだベストアンサー

  • ベストアンサー
  • b0a0a
  • ベストアンサー率49% (156/313)
回答No.2

外側の関数スコープの保持を意識して作られた関数をクロージャとJSでは言うと思います 再帰は関係ありません

re97
質問者

お礼

回答ありがとうございました >再帰は関係ありません ・参考になりましたー

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

closure を「閉包」と訳すときもあるけど, こっちの世界では単に「クロージャ」とするでしょうね. 再帰は recursion の訳.

re97
質問者

お礼

回答ありがとうございました >こっちの世界では単に「クロージャ」とするでしょうね ・言われてみれば確かにそうですね >再帰は recursion の訳 ・参考になりましたー

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 再帰を非再帰に実装しなおしたいです。

    odd-even merge ソートを、再帰を用いずに実装したいです。 再帰有りの処理は以下のとおりの実装となります。 http://ideone.com/mAYt61 これを再帰無しの処理に実装し直したいのですが、(odd_even_mergesort関数一つにまとめたい) 上手く書けません。良い書き方を教えていただけますでしょうか??

  • VC++ 再帰呼び出しについて

    VC++6.0にてプログラミングを行っているものですが、 関数の再帰呼び出しについて質問です。 再帰呼び出しの際にスタックに積まれる変数というのは、 再帰呼び出しをする関数に渡す引数のことですか? スタックオーバーフローを起こさないために、 staticなポインタにHeap領域上の 変数を割り当てるとよい。 と分かったのですが、 この意味は、例えば static int *a = new int; ということなのですか?

  • PythonVer3の再帰について

    現在、再帰について勉強しています。 関数のステートメントブロックの中に同じ関数を2か所使った場合の、処理される順番がよく解りません。 そこで、プログラムが表示されている状態で、Enterキーを押す毎に1行ずつ処理が進んで行き、今どの行が働いたかが分る様なソフト又は方法がないでしょうか。 よろしくお願いいたします。

  • C言語 再帰処理のメリットとデメリット

    最近、C言語の関数にも再帰定義ができるということを初めて知りました。 そこで聞きたいのですが、再帰処理のメリット・デメリットは何でしょうか? 思いついたものとしては メリット … 簡単に表記できる デメリット … 無限ループが発生する可能性あり でしょうか。 また、全計算が終わるまでに、途中の演算結果を保持しなければならないので、 メモリを無駄遣いしそうな気もします。

  • スペイン語 再帰動詞・再帰代名詞がよくわかりません。

    スペイン語 再帰動詞・再帰代名詞がよくわかりません。 この春からスペイン語の勉強を始めた者です。 ここにきて再帰動詞・再帰代名詞がわからずに困っています。 テキストには“動作が再び自分に返ってくる動詞”と書いているのですが、この日本語の意味さえわかりません。 再帰動詞を使うときとそうでないときはどう違うのでしょうか? 英語で同じ役目の用言はありますか?(自動詞・他動詞とか・・・) どなたか小学生に教えるのと同じように噛み砕いて教えていただけませんでしょうか?

  • 出口(戻り値) 再帰処理

    情報処理を独学で勉強しています。4月の初級シスアドに合格して,元々初級シスアドの午前を基本情報技術者の参考書で勉強していて,基本情報技術者の午前が70%ぐらいとれるようになってきたので,午後の勉強を「基本情報技術者 午後 完全合格教本」という本を買って始めました。 タイトルの「出口(戻り値)」この関数を呼び出したプログラムに戻り値を返すというのが再帰処理(再帰を使わないn!プログラム)の中でどうゆう処理をしているかが分かりません。 ○ プログラム名:再帰なしnの階乗 ○ 整数型 : 答 ・答 ← Fa(5) ・表示命令(答)     {答の内容を表示する} ○関数名: Fa(n) ○整数型: ANS ▲ n>1 | Yes |    ・Ans←n*Fb(n-1) ◇ No   |    ・Ans←1 ▼ ・出口(Ans)   (1) これがFa(n)がFb(n),Fc(n),Fd(n),FbがFcFdFe同じのが3回続きます。その後に ○関数名: Fe(n) ○整数型: ANS ▲ n=1 | Yes |    ・Ans←1 ▼ ・出口(Ans)   (2) となります。 参考書の実行の様子というのを見ると、最初は出口(Ans)をずっととばして最後の(2)のところまで来て戻るみたいになっているんですが、何がどこに戻ってどうなっているか、私の知っている知識の中で説明ができる方、よろしくお願いします。

  • C++でforや再帰関数を使わずに、総当りする方法はありますか?

    C++等で、forを使わず、再帰関数を使わずに多量のループで総当りする方法はありますでしょうか? 自己末尾再帰関数というのがネットで出てきますが、C言語系では使えないみたいです。 再帰関数で変数を全てスタティックにしても、関数の多重呼び出しで容量を食ってプログラムが動かないほどの計算をこなす必要があるのですが、こういった多数の桁のやり方になれておらず、先が見えません… また、全部をforにするのも、桁が大きすぎて問題があります。 どなたかご教授くださいますと幸いです。

  • 再帰処理を非再帰処理に書き換える場合

    TreeViewなど階層数・要素数が動的に変化し それらすべての要素に対して一括処理をするといった 本質的に、真に再帰的な操作をしなければならないような場合なのですが 状況説明のため少ないメンバに絞ると こんなノードの抽象クラスがあるとします namespace TreeView { namespace Node { class Super; }} class MemoryMap; class TreeView::Node::Super { protected: typedef Super* PTR; PTR next, child; Super(); virtual ~Super(); virtual Void Save( MemoryMap* ) const = 0; public: static Void Release( PTR* pp ); template <class T> static Void Release( T** pp ){ Release( (PTR*)pp ); } }; んで using TreeView::Node::Super; Super::Super() : next(NULL), child(NULL){} Super::~Super(){} こんな感じにしといて、任意に追加、挿入しときますと その後一括解放のためのReleaseの本体は Void Super::Release( PTR* pp ){ for ( PTR p; p = *pp; ){ if ( p->child ) Release( &p->child ); *pp = p->next; delete p; } } こんな感じで、再帰を使えば結構簡単に書けると思うのですが ・・・利用法から考えてよっぽどないとは思うのですが やはりそこは一応 スタックオーバーフローの危険性をコードサイドから積極的に ほぼ回避しておくべきと考えると 階層数の上限を設けておいて 最低、追加・挿入時には、それをチェックする というのが良いかと思うのですが 仮に別のアプローチで こういった類の再帰(もっと複雑な場合のが多いかも)を非再帰関数に直すには やっぱり ・goto文 ・自分でヒープ上などに作る疑似スタック ・そのスタックに、gotoのジャンプ位置を保存できるenumとかの定数フラグ などを使用せざるを得ない って感じになってくるんでしょうかね?

  • 再帰的(リカーシブ)プログラムの説明について。

    以下は、再帰的(リカーシブ)プログラムの説明を記載しました。 この説明文でおかしい箇所の添削をお願い出来ないでしょうか? 宜しくお願い致します。 以下からになります。 再帰的(リカーシブ)プログラムとは、プログラムの中から自分自身を呼び出して実行することを再帰的(リカーシブ)アルゴリズムといい、この形式で再帰呼び出しを行うプログラムのこと。 まずは、再帰的アルゴリズムについて、例を使って説明を行いたい。 主プログラムとサブルーチンaがある。 主プログラムは、文字通り、主(メイン)となるプログラム。 サブルーチンは、主プログラムが呼び出して利用する処理をひとまとめにしたもの。 文字通り、サブとなる処理を行う。 主プログラムには、CALL aという命令が記述されている。 これはサブルーチンaを読み出すという命令。 この再帰的プログラムは、処理が終わったら、読み出された場所に帰っていく。 このため、戻り場所を記憶しておかないと帰る事が出来ない。 この戻り場所を記憶するのが、LIFO方式による記憶領域になる。 LIFO方式の記憶領域だから、スタック領域になる。 スタック領域だから、後入れ先出しで戻り場所を記憶していく。 まずは、1回目の呼び出しとして、主プログラムがサブルーチンaを呼び出している。 1回目の戻り場所を記憶しておく。 次にサブルーチンaを見ると、CALL a、つまり自分自身を読み出している。 これが2回目の読み出し。 このように自分自身を呼び出すことを再帰呼び出しという。 同じプログラムの中で自分自身を読み出しているのだが、コンピューターは、あたかも別のサブルーチンがあるように処理が行われている。 この場合、それぞれの処理で、別の変数を用意しながら処理を行う。 このサブルーチンで処理が終わった場合にも、もとに戻る必要がある。 これは2回目の呼び出しになるため、2回目の戻り場所を記憶しておく。 更に、3回目として再びサブルーチンaを呼び出す。 3回目の戻り場所を記憶し、また別の変数を用意しながら処理を行う。 ここで最後のサブルーチンで処理が終わったとする。 処理が終わったら、呼び出された場所に戻る。 戻り場所の記憶を見てみると、上から戻る順番に記録されていることがわかる。 戻り場所はLIFO方式、後入先出しで記録されているから、最後に呼び出した3回目の戻り場所が1番上に記録され、次に2、最後に1が記録されている。 最初は戻り場所を記憶した記憶領域を参照して、3回目に呼び出された場所に戻る。 ここで3の戻り場所が消える。 そして引き続き処理が行われる。 次に、2回目に呼び出した処理が終わり、2回目に呼び出された場所に戻り、2の戻り場所が消える。 また引き続き処理が行われ、1回目に呼び出した処理が終わり、1回目に呼び出された場所(主プログラム)に戻り、1の戻り場所が消える。 そして処理が行われ、プログラム全体が終了する。 このように、プログラムの中で自分自身を呼び出し、戻り場所を記憶しながら実行するようなプログラムを再帰的(リカーシブ)プログラムという。

  • マージソート内の再帰処理にすいて

    #include<stdio.h> #define MAX 4 int temp[MAX]; void marge(int num[],int left,int right) { int i,j,mid,k   if(left>=right)return; mid=(left+right)/2; marge(num,left,mid);//(1) maege(num,mid+1,right);//(2) for(i=left;i<=mid;i++) temp[i]=num[i]; for(i=mid+1,j=right;i<=right;i++,j--) temp[i]=num]j]; i=left; j=right; for(k=left;k<=right;k++) if(temp[i]<=temp[j]) num[k]=temp[i++]; else num[k]=temp[j--] } マージソート内はこういった関数を記述してエラーもでないのですが、(1)と(2)の処理がよくわかりません。 (1)は再帰的に処理していってif(left>=right)return;の条件を満たした場合に(2)の処理に入っていきますよね? その場合、(2)の処理を行う際に(1)が(2)の再帰より前に記述されているので(1)がまた処理されるのでしょうか? 一連の流れを(1)、(2)を使って表してほしいです。