トップページ⇒tech
1002コメント380KB

なあ、再帰関数好きな人いる? パート2 [転載禁止]©5ch.io

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさん2015/09/06(日) 17:35:49.88ID:8kAWPtv+
再帰とは何か?

http://ews2.cc.niigata-u.ac.jp/~takeuchi/tbasic/BackGround/Recursive.html

★再帰を使わない例
この階乗関数を Basic プログラムとして実現してみると,
(Tiny Basic には階乗関数 Factorial が内蔵されていますから,
実際にこのようなプログラムを書く必要はありませんが。)

Function Kaijyou(n)
If n = 0 then
Kaijyou = 1
Else
Kaijyou = Kaijyou(n-1)*n
End if
End Function

となります。しかし,実は階乗関数は,再帰を使わなくても,
次のように実現することが出来ます。

Function Kaijyou(n)
F = 1
For i = 1 to n
F = F * i
Next i
Kaijyou = F
End Function

↑再帰を使わなくても,次のように実現することが出来ます。
0809デフォルトの名無しさん2015/11/06(金) 10:09:10.72ID:iLvLfKdX
>>808
なんだそりゃ。
そりゃマルチスレッドなら、スレッド毎にスタックフレーム確保するだろ。
それこそ、勝手スタックと同じでな。
疑問に思ったら、メイン関数で再帰して何回目で死ぬかと、
スレッド2つ起こして、そのスレッド内で再帰呼び出し呼んで何回目で死ぬかを比較して見ればいいよ。
ついでに/procの中身も見ればわかりやすい。

スタックの成長方向に関しては、だいたい下位方向だよ。
だからバッファオーバーランで任意の関数を呼ぶって攻撃が成り立つ。
0810デフォルトの名無しさん2015/11/06(金) 10:47:43.57ID:iLvLfKdX
あー、もしかしてあれか。
ヒープに確保したスタック、ってのは、ヒープに参照を確保してメモリのどこかに確保したスタック、なのかな。
そりゃそのスタックはアウトオブメモリまで使えるわな。
違う機械語にもなるだろうな。多段の間接アドレッシングするクソ遅くて不安定な機械語に。

それでも根本的解決をせずに、マージン確保して死ぬのを先延ばしにしてるだけだけど。
まともな解法のためにまともに組んだ再帰ではそんなこともないし、
そうではない再帰の事言ってるんだろうけど、それは「ループは無限ループする可能性があるから危険」くらい暴論。
0811デフォルトの名無しさん2015/11/06(金) 11:12:47.56ID:LVZwl1iK
>>807,809-810
> ヒープが下から、スタックフレームが上から、同じメモリを食ってくんだから。
こういう迷信信じ込んでる老害が一番厄介。
#include <stdio.h>
int x;
int main()
{
int z;
printf("%p %p %p\n", &x, &main, &z);
}
Windows7/64での実行結果
000000013F63DB38 000000013F6211E0 00000000002CFB80

手元ですぐ確認できるのはWindows7しかないけど、大抵の64ビットOSは
プライマリスレッドのスタックサイズは固定サイズでリンク時に決定だよ。おじいちゃん。

実メモリをコミットするのはまた別の話。
0812デフォルトの名無しさん2015/11/06(金) 12:54:51.54ID:ldVrSRAZ
>>811
ヒープが何かもわかってないゆとりかよ w
0813デフォルトの名無しさん2015/11/06(金) 12:56:48.83ID:iLvLfKdX
>>811
迷信ではなくて、単に環境依存だろ。
んなもんリンカで決まるし、ましてやWindows7ならASLR効いてるんじゃねーの?
基本知らないで話してるわけでもあるまいし、なんか釣ってるの?
0814デフォルトの名無しさん2015/11/06(金) 13:29:16.84ID:LVZwl1iK
>>812-813
zのアドレス00000000002CFB80が何を意味してるか分かるか? わかんねーだろうな。バカだから。
2,947,968番地って事だ。

ジジイが信じている迷信は
> ヒープが下から、スタックフレームが上から、同じメモリを食ってくんだから。
って事だが、スタックが上から使って言って残り3M以下なんだが、ヒープは何メガ使えるんだ? 爆笑。
0815デフォルトの名無しさん2015/11/06(金) 14:09:49.10ID:+7OfKum1
再帰厨は白痴だね。
0816uy ◆Qawu9.2l1E 2015/11/06(金) 14:35:20.47ID:44+lavHA
環境を指定しない話でも、いつも必ずC言語のソース出して何か言ってる奴の話する?
0817デフォルトの名無しさん2015/11/06(金) 14:54:15.84ID:W6j+1tCI
ヒープはスタックの1000倍という見積もりをよくするけどね。
0818デフォルトの名無しさん2015/11/06(金) 14:55:35.21ID:W6j+1tCI
再帰厨って要はスクリプト言語を使ってる人たちだろ?
0819デフォルトの名無しさん2015/11/06(金) 15:15:31.42ID:LVZwl1iK
>>818
F77じいさんはオムツの特売に並んでろ。
0820デフォルトの名無しさん2015/11/06(金) 15:21:45.27ID:LVZwl1iK
> プライマリスレッドのスタックサイズは固定サイズでリンク時に決定だよ。おじいちゃん。
linux忘れてたわ。突っ込まれる前に訂正。

プライマリスレッドのスタックサイズは固定サイズで起動時に決定だよ。おじいちゃん。
0821デフォルトの名無しさん2015/11/06(金) 15:38:37.42ID:VF1V1DpN
面白発言

> ヒープが下から、スタックフレームが上から、同じメモリを食ってくんだから。
> ヒープが溢れると、スタックフレームも溢れてるし、
> スタックフレームが溢れるという事はヒープも溢れてる。
> 実際問題全く同じなのに。

これもうこの発言で終了じゃね?
0822デフォルトの名無しさん2015/11/06(金) 15:44:51.97ID:iLvLfKdX
>>814
そらそうだろう。
グローバル変数は.dataないし.bssに落ちて、
関数は.textに落ちて、そいつらはその辺のアドレスになるだろ。
メインスレッドのスタックは俺の環境でもその辺で、かつエントリポイントのヒープもその辺だわな。
固定サイズ、って、どこから固定サイズかわかってるのかなぁ。
デバッガで見てみりゃすぐわかるのに。
0823デフォルトの名無しさん2015/11/06(金) 15:56:30.79ID:VF1V1DpN
> スタックフレームが溢れるという事はヒープも溢れてる。

wwwww
0824uy ◆Qawu9.2l1E 2015/11/06(金) 16:11:44.79ID:Bw8X18sC
一応再帰厨らしいけどチョンみたいな奴だな
味方にした国が負ける
0825デフォルトの名無しさん2015/11/06(金) 18:19:40.96ID:ldVrSRAZ
>>814
で、ヒープはどこに行ったんだよ…
まさか 16進数の読み方でしかドヤれないのか w
0826デフォルトの名無しさん2015/11/06(金) 18:26:57.75ID:iLvLfKdX
まー、逆だったな。それは認めるわ。
ヒープが溢れるという事はスタックフレームが溢れるのと同じ事、かな。
virtualallocやらしてりゃ別だけど。

要はスタックフレームは無視して、ヒープに勝手にスタック作ってそれを使って処理すれば再帰は要らなくて、
ループで処理出来る、って言いたいんだろうね。
どう考えても向いてない事も、ループでオッケー、と。
0827デフォルトの名無しさん2015/11/06(金) 18:28:00.11ID:iLvLfKdX
>>825
ドヤってる訳じゃないけど。
自分で見てみれば?
0828デフォルトの名無しさん2015/11/06(金) 18:58:03.51ID:ldVrSRAZ
>>827
いや、だからどこにヒープがあるんだよ
.bss, .data, .text とかはヒープって言わんぞ
0829デフォルトの名無しさん2015/11/06(金) 19:08:39.94ID:LVZwl1iK
ID:ldVrSRAZ
お前、壊滅的に頭悪いな。

スタックが最下位の3Mにあるわけだ。さて、ヒープはどこにあるでしょう?
スタックより低アドレス? → スタックとヒープ合わせて3Mしか使えない。 大爆笑
スタックより高アドレス? → ↓これが嘘。 大爆笑
> ヒープが下から、スタックフレームが上から、同じメモリを食ってくんだから。
0830デフォルトの名無しさん2015/11/06(金) 19:22:13.10ID:LVZwl1iK
>>826
ちげーよ。バカ。
プライマリスレッドのスタックは固定サイズ。
おじいちゃん達が現役だった頃と違ってヒープと奪い合わない。

Win64は先に示した通り。スタックは最下位に置かれる。
他のOSでも共有ライブラリなどの為にアドレス空間が予約されるので、ヒープとスタックは隣り合った領域には配置されない。
0831uy ◆Qawu9.2l1E 2015/11/06(金) 19:24:34.00ID:ctWMnKjq
OS作った事ある奴いる?
0832デフォルトの名無しさん2015/11/06(金) 19:56:02.79ID:ZTXinl+H
OSの定義は?
0833デフォルトの名無しさん2015/11/06(金) 20:05:49.78ID:Jbsw4Wxa
再帰はほとんどの言語で使えるけど、実はループは使える言語が減ってきてるんだな

コレクションに対して繰り返し処理をする方法で、こんな分け方をしてみた
1. C の for 文のように添字を使って繰り返す。いわゆるループ
2. Java の拡張 for 文のように添字を使わないで繰り返す。1と3の中間
3. 高階関数を使う。

C (1) 今となっては低レベルに分類される言語なのでしょうがないか
Java (123) 基本的には2かな。ラムダ構文がJava8から導入されたので、これからは3に移行していきそう
C# (123) ラムダの導入がJavaより早かったので、2と3が混在している感じ
PHP (123) ほとんど使ったことがないのでよくしらないけど、基本的には2なのかな
Python (2) 添字ループはそもそも文法にないし、ラムダは使いにくいので必然的に2
Ruby (23) 一応文法として2はあるけど使ってる人はほぼ皆無。3が圧倒的
JavaScript(13) ラムダが最初っからあるんだけど、コレクションライブラリが貧弱すぎていまだに1が優勢
          おかげでunderscoreやらjQueryやらangularにまでforeach関数が用意されるというカオス
Scala (3) for式はあるがこれはmapを使うただの糖衣構文。よって3のみ
0834uy ◆Qawu9.2l1E 2015/11/06(金) 20:09:11.87ID:Y2REc2we
プロセス起動とスタックとヒープのメモリ割り当て周りのコード書いた事ある事が最低レベル
0835uy ◆Qawu9.2l1E 2015/11/06(金) 20:12:59.87ID:Bw8X18sC
jsにもmapあるんだけど
https://lodash.com/
0836デフォルトの名無しさん2015/11/06(金) 20:17:37.45ID:Jbsw4Wxa
>>835
あるのは知ってるし、俺も使わせてもらってる (underscoreの記述はしたし、分かってもらえてるとは思うけど)
今回は言語+ビルトインライブラリの話をした
0837デフォルトの名無しさん2015/11/06(金) 21:08:34.74ID:iLvLfKdX
>>829
はー、なるほど。
今デバッガでステップで見てたけど、今のOSは賢いな。素直にこれは勉強になったわ。

やっぱCしなきゃならんな。
ずっと割と特殊な言語してるからな。
0838デフォルトの名無しさん2015/11/06(金) 21:09:42.32ID:iLvLfKdX
>>834
言語じゃなくて処理系だけどあるよ。
0839uy ◆Qawu9.2l1E 2015/11/06(金) 21:14:05.86ID:ctWMnKjq
質問の意図が全くわかってないカスだな・・・
0840デフォルトの名無しさん2015/11/06(金) 21:58:03.15ID:bdwf2snB
コンパイラやインタプリタならあるな
0841デフォルトの名無しさん2015/11/06(金) 22:29:45.01ID:iLvLfKdX
>>839
どんな意図?
0842uy ◆Qawu9.2l1E 2015/11/06(金) 23:29:26.68ID:P+wdThaZ
                  .  - ‐─━…|
             . : : : : : : : : : : : : : : : :|     て   誰
           /:: . : : : : : : : : : : : : : : |     め   だ
            /:/: : : : : : : : : : : : : . : : :l     |   よ
           /.:/ : : : : :i: : : : : : : : : : : : : }     は
        /.:/ . : : : : .:i : : : : :i: : 、: : : :ノへ、          /
         / ,′. : : : : : .:i : : : : :i: :i: '.: : :!::i:l\\         /
      /: .′. : i: : :i..::i : : : : :i:斗rヤ笊仄 ハ i>‐----<: ゚.
.     /: : ! . : : : i: : :i 人:. : : .:i::::.\l:斗-=ミ、}i|: : : :ハ: : : : : : ゚.
     /: : : i:. : : : :i: : ;ャ≦ \::八:人〃斧笊ハ 刈ハ: : : l- 、: : : :|
.    /: : : : i:. : : : :iX:八_ \ \:.\ 、 マ)  .::i }} }:.:.i.:!h ハ: :. : |
   厶 -‐ i:.: : : :∧ .〃斧�_  \   、_.:ノ   八ノリ.ソ }: :!: :l
/ ̄ ̄ ̄ ̄ ̄\: :∧{ マ  .:i               / }ノ.ノ : |∨
   ね 好 .い  ヽ: ヘ 弋.:ノ   ,           r<: : :ハ|
   | き  き    �Y゚:.                     /.:.:∧.:{ j
   ぞ 勝  な    Vi:!:.        ,   ¨フ       V.:( )ノ
     手  り     W八      ー      /  ∨}
     言 現    L__ ` ..           /     〉- 、
      っ れ     √      ¨¨  ¬ ´     /_三二ニ=‐-
      て  て    ;            __ハ    /. : : : : : : : : : : :
     ん       /          ノ.:r'ヘ /: : : : : : : : :斗ャ≦
     じ     /         /: / / : : : : : : 。≦ニ〃/
       ゃ   /        /: : :/ /: : : : : : /三=‐ {{/
0843デフォルトの名無しさん2015/11/07(土) 10:58:02.89ID:RwXev/UR
どうでもいいけど、

> ヒープが下から、スタックフレームが上から、同じメモリを食ってくんだから。
> ヒープが溢れると、スタックフレームも溢れてるし、
> スタックフレームが溢れるという事はヒープも溢れてる。
> 実際問題全く同じなのに。

この発言の説明しろよ

特に

> スタックフレームが溢れるという事はヒープも溢れてる。
0844デフォルトの名無しさん2015/11/07(土) 11:57:45.08ID:ptDOELGY
スタックフレームが溢れるような良くない再帰関数を、
ヒープ領域に用意したスタックとループで実装し直してもアウトオブメモリになる危険性は変わらないよ!
ループや再帰が出てくる前の、アルゴリズムの見直しをしようね!
0845デフォルトの名無しさん2015/11/07(土) 15:07:28.74ID:JLeExy5d
>>843
もう説明したでしょ。

>>844
そのとーり。
0846デフォルトの名無しさん2015/11/07(土) 15:28:58.81ID:RwXev/UR
もう一度自分の書き込みを呼んでみよう

> ヒープが下から、スタックフレームが上から、同じメモリを食ってくんだから。
> ヒープが溢れると、スタックフレームも溢れてるし、
> スタックフレームが溢れるという事はヒープも溢れてる。
> 実際問題全く同じなのに。

全然説明になって無いね
0847デフォルトの名無しさん2015/11/07(土) 19:07:11.11ID:aPHPZ3+u
>>805
InterLisp-Dはスタックフレームはヒープ上に取るから仮想記憶が尽きるまで。
ちなみに実行を止めてダンプを持ち運べば別のマシンで再開できた。
0848uy ◆Qawu9.2l1E 2015/11/07(土) 21:38:02.16ID:Rb6TxNfK
ループ(笑)
0849デフォルトの名無しさん2015/11/07(土) 22:12:39.02ID:k3SZd1ks
>>848
再帰は関数の最後まで見ないと繰り返しの処理をやってるかわからないんだよ。
これを見て欲しい。

function testA() {
 ...(数百行)
 testA();
}

一方ループは関数の先っちょあたりで、あこれは繰り返し処理をしてるな
っていうのが即座に判明する。プログラムの構造が人間の理解を助ける。
これを見て欲しい。

function testB() {
 for (int i = 0; i < 1000; i++) {
  ...(数百行)
 }
}

この事実を知ってもなおあなたは再帰を支持しますか?
0850デフォルトの名無しさん2015/11/07(土) 22:27:57.81ID:k3SZd1ks
再帰は繰り返し処理をしてるってのがぱっと見わかりづらいし、
処理が遅いしスタックオーバーフローするし、使いどころが
あまりないよね。
0851uy ◆Qawu9.2l1E 2015/11/07(土) 22:35:01.57ID:0QRugbs1
ルビリストから無名再帰使ってるわ

Mumei_saiki_kakkoloopwara do |f|
 処理
 f.call
end

これが再帰て言ってもわからないよね。。。。。
0852uy ◆Qawu9.2l1E 2015/11/07(土) 22:36:05.67ID:0QRugbs1
>>851 ルビリストから → ルビリストだから
0853デフォルトの名無しさん2015/11/08(日) 04:56:54.05ID:36/ICdkK
>>849 普通は ...(数百行) を procA(); と置き直すだろう。
0854デフォルトの名無しさん2015/11/08(日) 08:58:38.41ID:ruUsjfQ4
>>851
>>106でそれのパクリ元は外出
0855uy ◆Qawu9.2l1E 2015/11/08(日) 09:37:12.54ID:w/pNyAon
無名再帰がパクりとか意味わからないんですけど
0856デフォルトの名無しさん2015/11/08(日) 09:46:42.44ID:ruUsjfQ4
>>855
無知を自慢しなくても良い
0857デフォルトの名無しさん2015/11/08(日) 10:40:01.80ID:D4jx3nEw
>>853
ありえねえ。ループのたびに関数作るのかお前は。
関数ヘルだな。
0858デフォルトの名無しさん2015/11/08(日) 11:43:39.05ID:zIxOYVPQ
>>857
処理が長い場合、タスク分割のために関数・メソッドにしておくのはごく一般的な事。
プログラマとして仕事したいなら、働く前にリーダブルコードを読んでおくといいよ。
0859デフォルトの名無しさん2015/11/08(日) 11:58:26.23ID:EqVtngVc
>>849
あのな、そのレベルのものを、再起だとかループだとかいう時点でおかしいと気づけ。

例えば、
parseDoc(lpStr) {
  :
 みたいな関数で、while(...)で、strが尽きるまでループしている中で、
 if(cmd=="eval") lpStr=parseDoc(lpStr);

 みたいに使えば、あ、同じ構造を処理してるんだな、終わったらポインタが進むんだなって一目でわかるでしょ。
これを理解した上で、勝手スタックに今のポインタ値保存して、必要なら変数も保存して、終わったら戻す、みたいな処理のほうが良いなら、説明してほしいわ。

あと関数数百行はおかしいから。
80行〜120行でも長大関数。
0860デフォルトの名無しさん2015/11/08(日) 13:05:36.05ID:D4jx3nEw
>>858
本のタイトル知ってるだけのシッタカさんお疲れ様です。
0861デフォルトの名無しさん2015/11/08(日) 13:07:41.95ID:D4jx3nEw
>>859
何を言っとるんだチミは。
0862デフォルトの名無しさん2015/11/08(日) 13:08:56.74ID:D4jx3nEw
仕事でプログラムやるなら関数数千行とかザラだから。
それらを読み解けなければやっていけない。
0863デフォルトの名無しさん2015/11/08(日) 13:31:25.99ID:YL2+Mlqr
ザラって…奴隷の鎖自慢でしょうか?
0864デフォルトの名無しさん2015/11/08(日) 13:48:33.01ID:hJdCHUnW
>>861
何に疑問持たれてるかわからん。

>>862
仕事でプログラムしてるけど、そんな関数書いたらQCレビューではねられるよ。
そんなレビューもない会社なら別だけどさ。
0865デフォルトの名無しさん2015/11/08(日) 14:00:37.62ID:D4jx3nEw
>>864
>>859は全面的に何を言いたいのかわからない内容だ。
小企業のジコマンレビュー受けて書きなおせば?w
0866デフォルトの名無しさん2015/11/08(日) 14:02:48.23ID:YL2+Mlqr
コードレビューもないような企業が未だにあるってことに驚き
0867デフォルトの名無しさん2015/11/08(日) 14:03:30.47ID:D4jx3nEw
ちなみに俺は一部上場の超一流企業の物流部門に所属してる。
関数は1000行超えてからやっと新人卒業って感じかな。
ベテランになると万超えるよ。
0868デフォルトの名無しさん2015/11/08(日) 14:04:39.12ID:D4jx3nEw
>>866
なんのためのレビューだよw
レビューしなきゃ不安になるような人員雇ってる時点でお察しだわw
SIerか?じゃあしょうがないよね。
0869デフォルトの名無しさん2015/11/08(日) 14:06:39.84ID:D4jx3nEw
コードレビューw
0870デフォルトの名無しさん2015/11/08(日) 14:09:05.13ID:D4jx3nEw
リーダブルコーディングとか読んで
よしこれからドメイン駆動開発だ!とか言っちゃってんじゃないの?w
プログラム業界の中二病ですわwwww
0871デフォルトの名無しさん2015/11/08(日) 14:11:08.30ID:YL2+Mlqr
逆になんでしないの?
そこまで余裕ないの?
0872デフォルトの名無しさん2015/11/08(日) 16:34:19.49ID:ezMQjLzR
1万行の関数は頻繁に目にする。
読まないけど。
0873デフォルトの名無しさん2015/11/08(日) 17:13:32.26ID:ruUsjfQ4
1万行の関数ってtraslation limitsのどれかを超えてたりしない?
行数の制限はないけど、他の項目で引っかかってても不思議じゃない。それくらいアホ。
0874デフォルトの名無しさん2015/11/08(日) 17:19:54.12ID:krAhSW9o
オブジェクトどころか構造化すらしていないコードやコピペ繰り返して常識を超えた行数になったり全く何もしていない関数呼んだり
社員教育してない会社のコードは凄い事になってる。
0875デフォルトの名無しさん2015/11/08(日) 17:27:16.44ID:Ai/4n8j5
社員教育してない会社だと
再帰処理しているような極悪コードが見逃されてしまう。
0876デフォルトの名無しさん2015/11/08(日) 17:39:39.08ID:ayKNhgcG
ループでは書けない再帰構造のお話はどうなったんだろう‥
0877デフォルトの名無しさん2015/11/08(日) 18:00:06.71ID:ruUsjfQ4
社員教育されてない底辺企業の社員には再帰アルゴリズムは理解不能なので禁止されている。
0878デフォルトの名無しさん2015/11/08(日) 18:43:05.21ID:Ai/4n8j5
再帰厨の脳味噌は、再帰アルゴリズムが理解不能な社員が想定できる時点で
現実世界と回s利しまくり。

これが永遠ヒキニートの再帰厨の現実。
再帰アルゴリズムを見るだけですさまじい苦労なんだろう。
0879デフォルトの名無しさん2015/11/08(日) 18:54:26.34ID:krAhSW9o
再帰を否定も推進もする気はないが、確かに社員教育なしに再帰使うのは怖すぎる。
0880デフォルトの名無しさん2015/11/08(日) 18:57:00.93ID:ezMQjLzR
Nw
0881デフォルトの名無しさん2015/11/08(日) 19:03:15.46ID:ruUsjfQ4
理解不能だったが、ID:Ai/4n8j5を見て、そう言う底辺も世の中には存在する事を知った。
バカを使うためには難しい事を禁止して、バカの能力の範囲内で使う事が肝要。
0882デフォルトの名無しさん2015/11/08(日) 19:53:59.36ID:krAhSW9o
「バカ」つっても若い奴は未熟なだけだ。コードを見せて勉強させる。
問題はバカ上司。効率が落ちるのは必至。ジョブが頓挫してもおかしくない
0883デフォルトの名無しさん2015/11/08(日) 20:03:50.49ID:HEL0zLh3
>>865
お前アホなのかな。

何なんだろう。コードが長くて一人前はあり得ないわ。
不安だからレビューするんじゃなくて、品質をより上げるためにレビューするんだけどなぁ。
俺は医療だけど。スタンプラリーが10箇所超えてる。
0884uy ◆Qawu9.2l1E 2015/11/08(日) 20:26:12.13ID:w/pNyAon
>>856 
質問です。



 無名再帰がパクりってな に?
無 名再帰がパクりって なに?
無名 再帰がパクりっ てなに?
無名再 帰がパクり ってなに?
無名再帰 がパク りってなに?
無名再帰が パ クりってなに?
無名再帰がパ  クりってなに?
無名再帰が パク りってなに?
無名再帰 がパクり ってなに?
無名再 帰がパクりっ てなに?
無名 再帰がパクりって なに?
無 名再帰がパクりってな に?
 無名再帰がパクりってなに ?
0885uy ◆Qawu9.2l1E 2015/11/08(日) 21:52:16.34ID:hjGS9Lf9
三ミ三三三三リ┼┼l l      / ,.  ---  -= _    Y三ヲ/ ̄ \   〈ニ三
  r'三三三三{  .ノ┌‐┐   ./≠::::::::::::::::::::::::::::::::::ミx、 ノ'´  | 繰   .|    Y三
  乂三三三ニ]     ノ ツ {:::::::::::::::::::::::::::::::::::::::::::::`' 、__   |  り  |   ノ'"´
    ̄⌒^フ圦      ,,'" ̄::::::::::::::::::::、:::::::::::::ヽ:::::::::::::< ∠. 返 | ,/
ミx、     `三≧=-、_/:::::::::::::::::::::::::::::::::::::ヽ::::::::::::∨:::::::::::::ヽし|.  :  .|
三L、         /::::::::::::::::::::::::::斗┼ヘ∧::::::::::::i::::::::::::::::: L.| 文   .|
三ヘ三彡⌒ー   ∠._/:::::::::::::::i:::::::::∧| ,x'"芯ミ、::::::::|:::::::::≧=- \  /  -=≦彡
               .':::::::::::::-┼''"/    { _r} }}::::::::::::::::::::::/ ̄   \
    ,        {:::{:::::∨〃芯      ‘¨” '"}:::/^!::::::::::|  :  .こ |
≧=-'´         Vヘ:::::::'.::...ヒ:ノ        ノイ ,|:::::: /|  :  の |
                ヽ:::ヘ:::::「 `       U _ノ:|::::::/ |  :  感 |
                ` ヘ/   く_ 〕   .|ハ::∧/ .l !! .じ |
                  `  .,_    /  | .}'  .  \___./
                       丁    L...、 i
                         i .i|;iノ」    ´__ `ー|l!、 i|
                     rl | 川'  ./ / r 'rー‐-、`i|:l!  ヽ | ll
                  /|  / ̄/  / └' ノ⌒`´  |x、  /
                 ./∧ / ./  ノ    二二ユ   ヽ、  ソ''
                ノ {:l:l}/--/ ア     二二,フ   {ハ   ッ
                ,廴__>'"  〈{ 乂_   ノ ̄ ̄    l  }
0886デフォルトの名無しさん2015/11/08(日) 22:19:47.99ID:D4jx3nEw
>>884
昔々、恐竜が生きていた時代に条件分岐や繰り返しと行った処理は
ぜんぶgoto文で行われてた。ダイクストラさんはそれがわかりにくいってことで
goto文は有害と思われると言って構造化プログラミングを提唱した。
今日のプログラム言語は条件分岐に用いるif文や繰り返しに用いるfor,whileといった
専用の構文を用意している。もはや構造化を意識する時代じゃないし、
JavaやRubyのようにオブジェクト指向の言語を使えば自動的にオブジェクト指向になる時代だ。
お前は時代遅れの原始人ってことを自覚するべきだと思われる。
0887デフォルトの名無しさん2015/11/08(日) 22:20:40.52ID:D4jx3nEw
>>886は>>874あての間違いです。
uyさんごめんなさい。uyさんごめんなさい。uyさんごめんなさい。
0888デフォルトの名無しさん2015/11/08(日) 22:43:10.55ID:D4jx3nEw
現代のプログラマーの問題点ついて論文書いた。読んでくれ。

構造化にしてもオブジェクト指向にしても、それらはプログラムを管理しやすくするための技術だ。
あくまでもプログラムを管理するという目的があってその目的を達成するための手段の一つ。
ところがろくに知識のない知ったかぶりっ子は往々にして手段と目的を取り違える。
関数を分割すること、オブジェクトを分けること、デザインパターンを使用すること
その作業そのものを目的にしてしまう。十分にわかりやすいプログラムであっても
関数が分かれていないからわかりにくいプログラムだと思い込んでしまう。
ご本を読んでわかった気になってる経験の浅いニワカ野郎が陥る落とし穴だ。
俗にいう意識高い系である。
0889デフォルトの名無しさん2015/11/08(日) 23:57:20.92ID:QYMRsb+2
tree 構造に対して何かしようと思ったらどうしても再帰になると思うんだが。
0890デフォルトの名無しさん2015/11/09(月) 00:15:38.69ID:tkNS1IWM
>>889
スレタイよく見ろ。なるかどうかじゃない、好きかどうかを言えよ!(ドン!!)
0891uy ◆Qawu9.2l1E 2015/11/09(月) 00:28:47.36ID:VILofMhT
ループ → 自分で情報格納Arrayとインデックスを管理
再帰 → スタックと引数を使うから↑の変数宣言いらない

↑全てのループと再帰は末尾最適化して書ける

→ 再帰厨の勝ち
0892デフォルトの名無しさん2015/11/09(月) 00:50:25.68ID:tkNS1IWM
>>891
再帰でやるにしても配列と序数の管理は必要でしょうに。
引数つまりローカル変数を書き換えていくっしょ。

public class Test {
 public static void main(String[] args) {
  int[] a = IntStream.range(0, 10).toArray();
  rec_each(a, 0);
 }

 static void rec_each(int[] array, int index) {
  if (array.length <= index) {
   return;
  } else {
   System.out.println(array[index]);
   rec_each(array, index + 1);
  }
 }
}
0893デフォルトの名無しさん2015/11/09(月) 01:41:23.27ID:fyLz/sBu
>>884
↓これのどこがわからないんだろう? >>106が読めないのか?

>>854
| >>851
| >>106でそれのパクリ元は外出
0894デフォルトの名無しさん2015/11/09(月) 08:09:11.20ID:KQW6HPEX
>>891
関数使った時点で自動宣言されてるよ
専用機でもない限り宣言されないスタックなんてない

結局、再帰もループも使う側の概念の問題で、
具体的な違いなど見つからない
0895uy ◆Qawu9.2l1E 2015/11/09(月) 09:00:44.47ID:iJi5V/lc
>>892
インデックスのない再帰の例

# 最上位ノードのシンボルを得る
def top_symbol
 return up.top_symbol if up
 symbol
end

そして1関数の再帰の話というよりデータの管理方法の話だ
例えばクラスAのインスタンスが複数個必要な時、
ループ厨は配列で管理するけど、
再帰厨様はツリーで管理するから、その分の配列宣言が不要


>>893
は?

>>894
は?
0896デフォルトの名無しさん2015/11/09(月) 09:34:59.77ID:VSFTuqKT
gotoも必要であれば使うべきだと思うけどな。
アセンブラに毛の生えたような言語使ってるけど真剣に思う。
0897デフォルトの名無しさん2015/11/09(月) 09:40:27.96ID:KQW6HPEX
いや宣言されてるから
0898uy ◆Qawu9.2l1E 2015/11/09(月) 09:51:00.11ID:iJi5V/lc
>>897
君のような知恵のチンパンに、この事実を伝えるのは難しいけれど


"コンパイラ"が宣言してる内部変数と
ソースコード上で"宣言している変数"は別物だよ
0899uy ◆Qawu9.2l1E 2015/11/09(月) 09:51:56.06ID:iJi5V/lc
はあ誤字送信してテンション下がる
0900デフォルトの名無しさん2015/11/09(月) 09:52:48.66ID:Yjqxj+LL
長大なループもgotoもVMの命令デコードのループで使われてる。
使わないと高速化が厳しい。
適材適所。
0901デフォルトの名無しさん2015/11/09(月) 10:03:11.90ID:ddVcBsOP
>>898はシンボルが何か分かって無いようだな
コンパイラの知識が0なんだろうな
0902uy ◆Qawu9.2l1E 2015/11/09(月) 10:04:21.36ID:iJi5V/lc
Aクラスのインスタンス
f e d c b a を up という変数でつなぎ合わせた場合

a.up # => b
a.up.up # => c
a.up.up.up # => d
a.up.up.up.up # => e
a.up.up.up.up.up # => f
a.up.up.up.up.up.up # => nil

こんな状態になるわけだけど
p func a # => f

で f を取得したいときに関数funcはどのように書きますか?

def func z
...
end


-----------------
ちなみに再帰だと
def func z
 return func z.up if z.up
 z
end

こうなりますけど


ループでかけんの?
0903uy ◆Qawu9.2l1E 2015/11/09(月) 10:05:49.65ID:iJi5V/lc
>>901
ちなみに
僕の書いた「 symbol 」って変数名ですよ

頭大丈夫ですか?
0904デフォルトの名無しさん2015/11/09(月) 10:08:48.44ID:fyLz/sBu
>>895
>>>893
>は?
バカ自慢しなくて良いぞ。
0905デフォルトの名無しさん2015/11/09(月) 10:13:10.33ID:ddVcBsOP
>>903
哀れな奴だな
2chでコテハンつけて自己主張か
自殺したほうがいいんじゃない?
0906デフォルトの名無しさん2015/11/09(月) 10:16:16.49ID:ddVcBsOP
馬鹿がコテハンにしても馬鹿を晒すだけ
コテハンにしてなにしたいんだろうこの馬鹿は
0907uy ◆Qawu9.2l1E 2015/11/09(月) 10:16:21.37ID:iJi5V/lc
つまり、ループ厨完全論破で白旗ってこと?

また勝ってしまったのか
0908デフォルトの名無しさん2015/11/09(月) 10:17:20.17ID:ddVcBsOP
意味不明なコードを晒して勝ったも糞も無いだろ
自分の頭がおかしいということに早く気付いたほうが良い
レス数が900を超えています。1000を超えると表示できなくなるよ。