[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 08/08 14:06 / Filesize : 275 KB / Number-of Response : 1034
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

なあ、再帰関数好きな人いる?



1 名前:名無しのプログラマ [2015/08/09(日) 17:46:33.69 ID:Icb40LOY.net]
for,while使うの嫌いで基本的に再帰多用するんだが、だめなの?
皆から敬遠されてる気がする

2 名前:デフォルトの名無しさん mailto:sage [2015/08/09(日) 17:47:17.56 ID:FkAVUmEu.net]
いいんじゃね?

3 名前:デフォルトの名無しさん mailto:sage [2015/08/09(日) 18:22:59.30 ID:QXb6b8wRx]
プログラムカウンタの値が変わりスタック退避が行われ
処理効率が悪く不安定になりやすい
というか、それだけでスキル低いのばれるよね

ウケ狙いとか恨みがある場合に多用すりゃいいと思うよ

4 名前:デフォルトの名無しさん mailto:sage [2015/08/09(日) 20:07:41.86 ID:+GEmkdAw.net]
パフォーマンスがでないイメージがあるから再帰はなるべく避けるかな…

5 名前:デフォルトの名無しさん [2015/08/09(日) 20:50:06.80 ID:Q/67NMOw.net]
スタックオーバーフローを回避するために
プログラマが末尾再帰にしなければいけないっていうのが
超絶ダサいと思う

6 名前:デフォルトの名無しさん [2015/08/09(日) 22:53:43.45 ID:PuCXERZp.net]
再帰使えない奴はなにやってもダメ
なれるとむしろループが書けなくなる

7 名前:デフォルトの名無しさん mailto:sage [2015/08/09(日) 23:20:43.14 ID:cELMilqM.net]
好き嫌いの問題じゃなくて、ループと再帰は使い道が違うだろ。

8 名前:デフォルトの名無しさん mailto:sage [2015/08/09(日) 23:21:40.87 ID:MmR8qrNe.net]
リカーシブ使いのリカちゃんとか萌えキャラ作ったら、みんな好きになるよ

9 名前:デフォルトの名無しさん [2015/08/10(月) 00:11:12.37 ID:+JcaMZeA.net]
「ループと再帰は使い道が違う」というレベルの人はお呼びじゃないんじゃないかなあ。
「普段は Lisp や Prolog を使ってるのかもしれない」くらいの想像はしてあげたいものだ。

10 名前:デフォルトの名無しさん [2015/08/10(月) 01:03:21.60 ID:3agS2rXW.net]
再帰で簡単に書けないループはないが、
ループで簡単に書けない再帰はある。

再帰でおk

>>7みたいなのはHaskell触って発狂するといいよ。



11 名前:デフォルトの名無しさん mailto:sage [2015/08/10(月) 05:19:14.46 ID:o4/Calnz.net]
関数型を大域で使うのはバカだけ

12 名前:デフォルトの名無しさん mailto:sage [2015/08/10(月) 09:23:09.48 ID:/lbZh+eG.net]
再帰はパフォーマンスが悪すぎ
メモリ取り過ぎ

再帰の回数が多ければプログラムが落ちる

実用的なプログラムを書くなら再帰は厳禁
再帰は下らないネタ処理

ループなら1万回でも1億回でも高速に処理できる

13 名前:デフォルトの名無しさん mailto:sage [2015/08/10(月) 09:31:04.36 ID:DXpO9Rx+.net]
スタック使わないように考えて再帰作れよ。

14 名前:デフォルトの名無しさん [2015/08/10(月) 16:47:13.89 ID:+JcaMZeA.net]
リカーシブ使いのリカちゃん……いいかもね。
他には Concurrent処理のカレンちゃんとか。

15 名前:デフォルトの名無しさん mailto:sage [2015/08/10(月) 17:27:22.90 ID:rm8AF5t7.net]
わたしリカちゃん
今日もスタックを溢れさせて先輩に罵倒されて会社辞めろって言われたの
そろそろ録音データもそろったし、パワハラで訴えまくって一攫千金よ

16 名前:デフォルトの名無しさん mailto:sage [2015/08/10(月) 21:06:03.71 ID:CK/F4dHF.net]
for,while使うの嫌いだからって理由がもう駄目だ
何も考えてないっていってるようなもの

17 名前:デフォルトの名無しさん [2015/08/11(火) 00:30:45.20 ID:EeLTxYYq.net]
>>16
彼は確実に君より賢いと思うよ。

18 名前:デフォルトの名無しさん [2015/08/11(火) 03:14:25.43 ID:SPQSl72c.net]
>>12
>再帰はパフォーマンスが悪すぎ
>メモリ取り過ぎ
>
>再帰の回数が多ければプログラムが落ちる
>
>実用的なプログラムを書くなら再帰は厳禁
>再帰は下らないネタ処理

釣りなの?

19 名前:デフォルトの名無しさん mailto:sage [2015/08/11(火) 04:16:54.02 ID:1RwbGpvK.net]
使ってる言語にもよる

20 名前:デフォルトの名無しさん [2015/08/11(火) 12:31:37.30 ID:BomPGBV/.net]
for while嫌い = 嫌いだけど使えるんだろ



21 名前:デフォルトの名無しさん mailto:sage [2015/08/11(火) 15:13:45.87 ID:pr+lgJy5.net]
再帰とfor or whileで生成されるオブジェクトは別物
スタック浪費して実行アド変えるデメリットが理解できてないやつはヤヴァすぎ

玩具言語で玩具作ってるなら好きにすればー

22 名前:デフォルトの名無しさん mailto:sage [2015/08/11(火) 15:25:06.46 ID:TpmJtB/J.net]
暑いからかなんか変な人が出てきたな...

23 名前:デフォルトの名無しさん mailto:sage [2015/08/11(火) 17:15:37.10 ID:W3jiVQE7.net]
仕事で書くコードに再帰処理を入れるなんて、犯罪だな。

そんな犯罪者はとっとと首にしなくちゃ。

24 名前:デフォルトの名無しさん [2015/08/11(火) 17:42:06.75 ID:cL5jCBIN.net]
再帰関数は嫌いだからループに展開する

25 名前:デフォルトの名無しさん mailto:sage [2015/08/11(火) 18:24:05.65 ID:Ghx6BuLg.net]
ループで実装する

(意味なく)再帰にしたい!

再帰にするとスタックがー、関数呼び出しがー、どうのこうの

末尾最適化される再帰にすればいいんだぜ!フフン

末尾最適化されるような再帰コードを書く

コンパイラがループの実装に戻す


結論

人間がループを再帰に変換し、
コンパイラが再帰をループに戻すという無駄!

26 名前:デフォルトの名無しさん [2015/08/11(火) 20:07:51.21 ID:SPQSl72c.net]
再帰のほうがわかりやすいと思えない子が
無理にループを書き換えるのは意味ないね

27 名前:デフォルトの名無しさん mailto:sage [2015/08/11(火) 20:55:40.81 ID:I9e7/X97.net]
再起が得意かどうかで頭の良さが決まる

28 名前:デフォルトの名無しさん mailto:sage [2015/08/11(火) 21:08:11.97 ID:s8tCNx0W.net]
再帰苦手なんですけど考え方のコツとかありますか?

29 名前:デフォルトの名無しさん mailto:sage [2015/08/11(火) 21:12:51.45 ID:I9e7/X97.net]
生まれ持っての頭の差だからどうにもならない

30 名前:デフォルトの名無しさん [2015/08/11(火) 21:58:02.48 ID:EeLTxYYq.net]
最初の 8 時間は良かったのにな。彼らにはもうここに来る理由が無いんだろうな。



31 名前:デフォルトの名無しさん mailto:sage [2015/08/11(火) 22:20:09.41 ID:C3iuhTEx.net]
>>30
You must die

32 名前:デフォルトの名無しさん mailto:sage [2015/08/11(火) 22:22:14.08 ID:p1BzFXAw.net]
Cで再帰で書いたときに分かりやすくなるときだけ再帰にする
そのときもスタックの深さが管理出来ないようにはしない

33 名前:デフォルトの名無しさん [2015/08/11(火) 22:59:04.11 ID:hIAJ5PwO.net]
再帰が書きやすい言語で再帰で解きやすい問題を解く

34 名前:デフォルトの名無しさん [2015/08/11(火) 23:39:17.34 ID:BomPGBV/.net]
再帰苦手なのは練習不足なだけ
理解が早いのは完全に地頭がいいだけじゃね?

35 名前:デフォルトの名無しさん mailto:sage [2015/08/11(火) 23:47:24.15 ID:6ebVNzRe.net]
再帰馬鹿

36 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 00:19:33.18 ID:UEtymV4n.net]
問題が直感的に再帰で思い浮かんだなら
そして、プログラムなど知らない他人も
その対象を直感的に再帰にだと思うであろうものは
再帰にする価値はあるが、

そうでないものは、ループが良かろうよ。

37 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 01:27:14.94 ID:Pci5W2YJ.net]
まぁ再帰を直接書くよりかは汎用的な関数で書いた方がいいよ
>>= や map , foldで書けるならそっちで書くべし

38 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 09:02:17.34 ID:VcXSwt9v.net]
再帰はプログラミングのネタ問題のためだけの存在。

これを実際のアプリ開発で使っちゃいけないって分からないアホは、超危険で社会に有害。
一生プログラミングの問題を解いてるだけで引きこもっててね。

39 名前:デフォルトの名無しさん [2015/08/12(水) 09:38:26.25 ID:CSXYMy4+.net]
ScalaやOcamlを仕事で使ってる所なら普通に再帰使いそうなもんだが

40 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 09:51:11.59 ID:uNqySeoG.net]
酢からって再帰、注意しないと遅くなっちゃう



41 名前:デフォルトの名無しさん [2015/08/12(水) 11:49:56.16 ID:TAHn/fs+.net]
末尾再帰にする
fold使う

42 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 12:17:54.41 ID:KQiec6kq.net]
>>34
> 理解が早いのは完全に地頭がいいだけじゃね?

慣れの問題でしか無い。

プログラミング技術の学習段階はこんな感じ

1. 技術を知らない(再帰を知らない)
2. 技術があることをするが使えない(再帰を知っているが使えない)
3. 技術がわかる。(再帰がわかる)
4. なんでもその技術で解こうとする。(何でも再帰を使おうとする)
5. 技術を使うのに適切な場合とそうでない場合の区別がつく。(適切な場合に再帰を使う)

技術がわかった=技術をマスター ではなくて、必ず4の段階を通る。
で4の段階で止まってしまうと、技術使える俺は頭いいとか言い出すw

43 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 12:52:34.13 ID:Pe25qO3w.net]
ファインプレーの練習するやつみたいな感じだよ
普通に処理できる凡打にダイビングキャッチで飛びつく
俺が一番ダイビングキャッチが上手いんだ
誰よりも綺麗にローリングを決められる
だから俺が一番野球が上手いんだ

44 名前:デフォルトの名無しさん [2015/08/12(水) 14:53:32.12 ID:ALDJfVhA.net]
>>39
Scalaはともかく、OCamlは再帰使えないと話にならない
ループを使わせないためにforとwhileは使いにくくしてある

それにしても再帰がネタだとか言ってる奴は
ふだん何を書いているのだろうか…

45 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 15:04:08.55 ID:VrhF+ys7.net]
>>44
そんな言語一般的な業務では使われないよ

46 名前:デフォルトの名無しさん [2015/08/12(水) 16:34:31.46 ID:ALDJfVhA.net]
>>45
そうですか、よかったですね

47 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 17:33:35.71 ID:7e8ZJE3m.net]
超マイナー言語まで持ち出して、議論に勝った気になっちゃう
勝つことだけが目的の頭がおかしい人は無視しましょう。

48 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 18:39:35.26 ID:xMooa+yr.net]
C++のtemplateの列でも再帰使うだろ
C++がマイナーと言われたらもうしらん

49 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 18:42:06.21 ID:9kD/QFWj.net]
関数型で書いてるなら再帰でいいけど手続き型で無駄に再帰で書いてたらそいつブン殴るな

50 名前:デフォルトの名無しさん [2015/08/12(水) 18:53:02.68 ID:dUzyVUNe.net]
LL(k)再帰下降パーサー書くときもループに展開するの?



51 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 18:58:06.19 ID:jdzlUPnw.net]
>>48
それはやめたほうがいいよ。

52 名前:デフォルトの名無しさん [2015/08/12(水) 19:14:48.75 ID:JsRAlNhV.net]
>>50
再帰下降パーサ自体、セキュリティ上の観点から安易に採用するべきではないとされてる。
海外では常識になってきてるけど、国内で浸透するには20年くらいかかるかもしれんね。

53 名前:デフォルトの名無しさん [2015/08/12(水) 19:22:06.01 ID:YIqOZZQS.net]
再帰はネタじゃないだろ
業務では再帰使うことは滅多と無いかもしれないが、理解することでプログラムの重要な考え方が身につくと思う。
決してネタなんかじゃないw

54 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 19:43:06.19 ID:KQiec6kq.net]
>>53
俺は>>42でいう5の段階だから、当然知ってるよ。

再帰を知ったのは高校の時ぐらいかな?
指定ディレクトリ以下のすべてのファイルを処理する必要があって
必然的に知る必要があった。そこからもう10年以上たつし。

最近ではMIMEメールのパースとか、連想配列の
全ての値の処理とかで使ったかな。

再帰を使うことはめったにない。そしてミスをしやすい所でもある。
だから再帰を使うときは、再帰を考慮しなくていい形に置き換えるようにしている。
つまりJavaScriptでいうmapやreduceの形にする。再帰部分と処理部分に分けて再帰部分を隠ぺいする。
通常書くのはコールバックで呼ばれる処理部分のみ。
そうすることで可読性も大きく上昇する。

普段はやはり再帰のコードは書くべきじゃないよ。
可読性悪いからね。

55 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 20:12:28.34 ID:x2olvrlJ.net]
可読性の悪い再起とかあるの?

56 名前:デフォルトの名無しさん [2015/08/12(水) 20:19:49.72 ID:TAHn/fs+.net]
そりゃmapや畳み込みのような関数に比べれば読みにくいんじゃない?
逆にfilterMみたいな高階関数の実装みてすぐ理解とか難しそう

57 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 20:33:35.39 ID:KQiec6kq.net]
>>54
例えば連想配列の全ての値を×10したいなら、これだけでいい。

※JavaScript
recursive(obj, value => value * 10);

これだけで済むように(内部で再帰を使って)recursiveという関数を作る。
作った関数の中身はもう見る必要はないからあとはこれだけのコードで済む。
このコードは、その場で再帰のコードを書くよりも明らかに可読性が高い。
なので可読性が悪い再帰のコードは、さっさと隠蔽化してしまって
普段は再帰を意識しないようにするということ。

で所で話は変わるが、recursiveという名前をつけたが、
このように連想配列の全ての値を処理するという関数、
なにか適切な名前ない? 他の言語だとありそうなものなんだが。

58 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 20:34:03.13 ID:KQiec6kq.net]
自己レスしちまった。>>54じゃなくて>>55あて

59 名前:デフォルトの名無しさん [2015/08/12(水) 20:39:45.65 ID:TAHn/fs+.net]
普通はmapと呼ぶんでないかい

60 名前:デフォルトの名無しさん [2015/08/12(水) 20:45:15.71 ID:JsRAlNhV.net]
パーサはプッシュ型にした方が使い勝手良いんじゃないのかな。



61 名前:デフォルトの名無しさん [2015/08/12(水) 20:46:34.22 ID:TAHn/fs+.net]
あ 連想配列か
ScalaだとmapValuesって名前だな
アンダースコアみたいなjsライブラリではオブジェクトでもmapだ

62 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 20:47:57.61 ID:KQiec6kq.net]
>>59
mapは一般的には配列から配列の変換でしょ?
ツリー上の構造まで対応しているmapとかあるの?

余談けどmapって写像のことだよね。
数学勉強してるとプログラム言語みたいで楽しいよね。

代数学の体とか束とか。
体は演算子オペレータが定義されたクラス
束はComparableインターフェースを持ったクラス
とかさ。(↑結構適当にいってるので突っ込まないで)

こういう風にプログラム言語と結びつけて
解説している記事ってあまりないよね。
プログラミングなら知識あるんで、こっち方面から
数学を解説してくれるとわかりやすいのにw

63 名前:デフォルトの名無しさん [2015/08/12(水) 20:48:29.50 ID:ALDJfVhA.net]
>>62
traverse

64 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 20:51:09.08 ID:KQiec6kq.net]
>>61
俺はlodashの方が好みなんで(どうせ同じだろうから)こっちで話をすると

https://lodash.com/docs#map

確かにlodashのmapはオブジェクトにも対応しているようだ。
これはちょっと見落としていた。だけどこうなるみたいだけど?

function timesThree(n) {
return n * 3;
}

_.map({ 'a': 1, 'b': 2 }, timesThree);
// → [3, 6] (iteration order is not guaranteed)

俺の希望としては { 'a': 3, 'b': 6 } こうなってほしい。

65 名前:デフォルトの名無しさん [2015/08/12(水) 20:51:09.67 ID:JsRAlNhV.net]
ツリーは配列にすると操作が簡単になる場合がある。
HTMLを配列に変換して操作する処理をちょっと書いてみたよ。

66 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 20:53:32.81 ID:KQiec6kq.net]
>>63
それがあったか。
ディレクトリトラバーサルとか普通に言えるのに
思いつかなかった。

その単語が使われてる言語やライブラリってありますか?

67 名前:ID:KQiec6kq (連続書き込み規制対策で変更) mailto:sage [2015/08/12(水) 20:55:24.34 ID:S25mloU+.net]
>>61
lodashにmapValuesあるやん・・・

https://lodash.com/docs#mapValues

なんで俺気づかんかったんや・・・

68 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 20:59:28.34 ID:S25mloU+.net]
あ、残念。再帰ではなかった。工夫すれば使えるけど。

_.mapValues({"a":1, "b": 2, "c": {"d":4}}, n => n*3)
{ a: 3, b: 6, c: NaN }

69 名前:デフォルトの名無しさん [2015/08/12(水) 21:08:39.02 ID:ALDJfVhA.net]
>>66
Haskell

70 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 21:12:50.83 ID:S25mloU+.net]
>>69
ありがとう。

こういう原始的に近い処理をする関数は
いい英単語が中々思いつかんから困る。



71 名前:デフォルトの名無しさん [2015/08/12(水) 21:20:31.80 ID:TAHn/fs+.net]
ちなscalazというライブラリでもtraverse型クラスとかある

72 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 21:51:03.50 ID:DorBHKZm.net]
>>55
> 可読性の悪い再起とかあるの?

再帰に限らず頭の悪い人間が書いた代物は可読性が悪いケースが多い
プログラムコードに限らず文章でもね
聡明な人間が書いた再帰コードは頭の悪い人間が書いた同じ目的を果たす反復コードよりも可読性に優れている

73 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 22:24:59.02 ID:S25mloU+.net]
データそのものがツリー構造をしているようなものは
データそのものが再帰であるのだから
それを扱うコードも再帰を使ったほうがわかりやすい。

だけどデータがリスト構造なだけなら
普通にループを使ったほうがわかりやすい。

適切に選ぶべきだ。

74 名前:デフォルトの名無しさん [2015/08/12(水) 22:49:42.67 ID:JsRAlNhV.net]
ツリー構造を扱うのは難しいので、リストとして扱ったほうが楽だよ。

75 名前:デフォルトの名無しさん [2015/08/12(水) 23:00:43.40 ID:ALDJfVhA.net]
>>73
>だけどデータがリスト構造なだけなら
>普通にループを使ったほうがわかりやすい。

んなわけねーだろ


76 名前:普通に再帰使うわ []
[ここ壊れてます]

77 名前:デフォルトの名無しさん [2015/08/12(水) 23:01:27.55 ID:ALDJfVhA.net]
あ、まさかリストが再帰構造でツリーの一種だってことを理解してないとか?

78 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:10:56.27 ID:Pci5W2YJ.net]
>>73
リストは最も基本的な再帰構造だと思うんだけど
haskell
data [a] = [] | a : [a] deriving (Eq, Ord)

scala
sealed trait List[+A]
case class Cons[+A](head:A,tail:List[A]) extends List[A]
case object Nil extends List[Nothing]

79 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:16:15.63 ID:S25mloU+.net]
>>76
それは何の反論にもなってない。

リストはツリー構造のサブセット。
ツリー構造の柔軟性の一部を禁止してシンプルにしたもの。

そのシンプルなデータ構造に対してはシンプルな処理を
使ったほうがわかりやすくなるのは当たり前。
再帰よりもループのほうが単純なことしか出来ないが、
単純なことしか出来ないから、余計なことを考える必要がなくなる。

シンプルな構造にも複雑な構造にも複雑な構造用の道具を使うのではなく
シンプルな構造にはシンプルな構造用の道具、
複雑な構造には複雑な構造用の道具を使うことが、
適切に道具を選ぶということ。

80 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:16:55.97 ID:Pci5W2YJ.net]
length :: [a] -> Int
length [] = 0
length (x:xs) = 1 + (length xs)

ループより分かりやすくね?
まぁ  リストの長さなら
def length[A](list:List[A]):Int = list.foldLeft(0)((total,_)=>total + 1)
みたいにfold使った方がいいかもわからんが



81 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:18:07.58 ID:S25mloU+.net]
>>79
よくわからないので、ループで書いてくださいw

82 名前:デフォルトの名無しさん [2015/08/12(水) 23:18:53.71 ID:ALDJfVhA.net]
>>78
伺いますけど、あなたのリストにはループに使うインデックスついてるんですか?
appendとか恐ろしく高コストで使えない不思議なリストですね
でもそうじゃないとインデックスでのアクセスはO(n)なんでねえ

なんでリストを扱ったプログラミングしたことないくせに偉そうなんだろ

83 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:20:08.29 ID:S25mloU+.net]
>>81
え?append?
なんでオーダーなんか出てきてんの?

今までそんな話全くしてない。

話がずれてるね。

84 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:20:45.20 ID:Pci5W2YJ.net]
同じ「単純な事」しかできないなら
高階関数使ったほうがよさげじゃね?
fmap, foldr, >>=, <*> なんかを使ったほうがいいと思う

85 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:21:38.26 ID:S25mloU+.net]
>>83
そうだよ?

高階関数を使ったほうがもっと良い。
高階関数の話は上の方でしている。

ただ再帰を使って書く必要ねーなって話。

86 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:23:21.20 ID:Pci5W2YJ.net]
>>79
foldのほうが分かりやすいけど
再帰のほうは
リストの長さは空だったら0 空じゃなかったらtailの長さに+1したものって宣言的に買い取るだけ

87 名前:デフォルトの名無しさん [2015/08/12(水) 23:23:52.85 ID:ALDJfVhA.net]
>>82
なんで「そんな話」が出てくるのかわからないなら
再帰もリストもまったく知らないってことなんですけどねえ

低レベルだわあ

88 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:24:48.52 ID:S25mloU+.net]
> リストの長さは空だったら0 空じゃなかったらtailの長さに+1したもの

つまり、それ何をやってるの?
日本語で、一言で言うと・・・?

89 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:24:50.58 ID:Pe25qO3w.net]
メモリはベタ配列みたいなもんなんだから
むしろツリーはメモリ上の配列に表現されてるようなもんなんじゃ
まともなバイナリフォーマットって大抵オフセットもってたりしてシンプルにデコードできるようになってる

糞古いフォーマットでハフマンみてーなのだとどーしても再帰の使用を考えるようになるんだけど
これは今の計算機が持ってるほぼすべての並列化機構を機能不全にするのよね

90 名前:デフォルトの名無しさん [2015/08/12(水) 23:25:35.07 ID:JsRAlNhV.net]
C/C++だと、リンクリストはループで扱ったほうが良いんだよね。
HTMLを取り扱うクラスを書いてみたんだけど。
このスレ程度のデータ量でも簡単にスタックオーバーフローする。

タスクマネージャで見ると、ほんの数メガバイト、しかも大部分は
ネットワークキャッシュに使われてるような状態なんだけども。

まあ、C++使いは十分注意したほうが良いと思う。
あと、マシンスタックの大きさはWindowsなら簡単に設定できるわけだけど、
そんなことはせずに、素直にループにした方が良いマナーだと思う。



91 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:25:50.72 ID:S25mloU+.net]
>>86
苦笑w

話の内容はわかってる。
そんな話は俺はしてないといってる。
わかってるから、俺はしてないといえるわけだよ。

OK?

92 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:27:05.85 ID:Pci5W2YJ.net]
>>84
個人的には 
問題にあった適切な高階関数 > fold > 再帰 > 末尾再帰 >ループ
で読みやすさが変わるイメージ

93 名前:デフォルトの名無しさん [2015/08/12(水) 23:27:56.05 ID:ALDJfVhA.net]
>>90
リストをループで処理するとか言うアホに言われましても
どうぞmapをループでお書きくださいな

# 配列とリストの区別もついとらんとはねえ

94 名前:デフォルトの名無しさん [2015/08/12(水) 23:30:43.07 ID:ALDJfVhA.net]
>>89
末尾呼びにしなきゃそりゃそうなります

95 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:30:43.36 ID:Pci5W2YJ.net]
リストって再帰が一番やりやすいデータ構造だと思うんだけどなぁ
>>87
リストの長さ

96 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:31:51.38 ID:S25mloU+.net]
>>92
> どうぞmapをループでお書きくださいな

これでいい?

function map(list, callback) {
 let ret = [];
 for(item of list) {
  ret.push(callback(item));
 }
 return ret;
}

97 名前:デフォルトの名無しさん [2015/08/12(水) 23:32:45.32 ID:JsRAlNhV.net]
リンクリストの解放で、デストラクタがネストするのも気を付けたほうが良い。

これ、コーディング中は小さなデータでテストしてるから気が付かないことがあると思う。
というか俺はそうだった。

特定のサイトでだけスタックオーバーフローするので何かと思ったら、
デストラクタが再帰するのであった。

98 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:33:03.35 ID:6ZXtaURL.net]
レスを読む限り、mapのがよく問題を分離できるし並列もできるから
ループの方がよっぽど要らないような

99 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:35:11.79 ID:S25mloU+.net]
>>94
「リストの長さ」っていうより
「空だったら0 空じゃなかったらtailの長さに+1したもの」っていう方が
日本語の言葉として明らかに長いよね?

100 名前:デフォルトの名無しさん [2015/08/12(水) 23:35:36.01 ID:JsRAlNhV.net]
>>97
C++だとコンカレントは遅くなること多いんだよな。
コンカレントが入って喜び勇んで使ってみたけど、まあまだ使える時代じゃないと思った。



101 名前:デフォルトの名無しさん [2015/08/12(水) 23:36:17.69 ID:ALDJfVhA.net]
>>95
mapをmapで定義してくださってどうもありがとうございます


>>94
触っちゃダメ

102 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:36:36.85 ID:S25mloU+.net]
>>97
> レスを読む限り、mapのがよく問題を分離できるし並列もできるから
> ループの方がよっぽど要らないような

mapとループの話じゃなくて、
ループと再帰の話で、再帰使うまでもない所で
再帰使う必要ないよって話をしてるんだよ。

要らないとは誰も行ってない。
シンプルな道具を適切に使いましょう。

103 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:38:07.01 ID:Pe25qO3w.net]
CPUの並列化機構がマルチスレッドぐらいしかないとか思ってると勘違いが起こる

104 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:38:19.63 ID:S25mloU+.net]
>>100
> mapをmapで定義してくださってどうもありがとうございます

どこがmap?

for...of ループの話?

ほれ、for...of ループ の説明
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for...of

105 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:39:14.64 ID:6ZXtaURL.net]
>>96
自分もコピーコンストラクタの再帰バグとかよくやりますw
C++は基本的部品は自分で書かず、
よくテストされてもの使った方がいいですね

106 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:39:27.31 ID:S25mloU+.net]
for...ofループを使ってダメなら、

function map(list, callback) {
 let ret = [];
 for(let i = 0; i < list.length; i++) {
  ret.push(callback(list[i]));
 }
 return ret;
}

って書くだけだけどね。

107 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:40:41.46 ID:6ZXtaURL.net]
>>101
いえいえ、ループを引き合いに出してるので、
その2者なら再帰よりもループのが要らないでしょうと

108 名前:デフォルトの名無しさん [2015/08/12(水) 23:40:57.52 ID:JsRAlNhV.net]
>>102
SIMDとかは更にまだまだ時代じゃないような気がする。
特定の環境に合わせてシコシコこさえるくらいの時代。

109 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:42:37.68 ID:S25mloU+.net]
>>106
「要らない」の理由がおかしいんだよ。
再帰でループが実現できるのは知ってる。

君は、大は小を兼ねる理論で、
大があれば小はいらないという考え方だろうけど、

俺は大には大を、小には小を使った方が
いい(わかりやすい)と言ってるわけ。

110 名前:デフォルトの名無しさん [2015/08/12(水) 23:44:25.03 ID:JsRAlNhV.net]
>>104
俺もそれはそうだと思う。

最初、イテレータを持つようにしてみたんだけど、何となく汚く見えたんで
std::shared_ptr使ってノードを表現したら、デストラクタがネストするバグを
こさえてしまった。

でも、結果的に、感動的にうまく動くアルゴリズムができて満足。
色々勉強になった。



111 名前:デフォルトの名無しさん [2015/08/12(水) 23:46:49.96 ID:JsRAlNhV.net]
まあ、俺に言えることは、HTMLを取り扱うなら、リンクリストが予想に反して最強ってこと。

112 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:53:27.52 ID:Pe25qO3w.net]
>>107
パイプライン

113 名前:デフォルトの名無しさん mailto:sage [2015/08/12(水) 23:58:30.93 ID:6ZXtaURL.net]
>>108
私は再帰を代替にしろ、という話は一切してないですよ
率直に言って、あなたの主張は再帰を相手にしなくてもいい一般化ですし、
他人を下と決めつけてかかって煽ってるようにしか見えません。

114 名前:デフォルトの名無しさん [2015/08/13(木) 00:02:20.41 ID:AIiQbQBJ.net]
>>112
ひどいいいがかりだな

115 名前:デフォルトの名無しさん [2015/08/13(木) 00:03:45.02 ID:AIiQbQBJ.net]
〉他人を下と決めつけてかかって煽ってるようにしか見えません

レッテル張り

116 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 00:04:44.19 ID:Vkqae3ee.net]
>>108
ここは言語の違いだと思うけどjavascriptみたいな手続き型で再帰を特にサポートしていない言語は
再帰は基本的に使わない方がいいけど
関数型プログラミング言語だとむしろループより再帰の方が書きやすいし自然だから
よっぽど高速化したい時じゃないとループ使わないと思う(ループだとそのコードみたいに破壊的代入が含まれるし)

117 名前:デフォルトの名無しさん [2015/08/13(木) 00:09:22.93 ID:G0UckYXU.net]
>>114
レッテル貼りとは、太平洋戦争の頃に使われた言葉で、現代の若者は
ラべリング問題と言わないとわからないらしい。

あと、レッテル張りとは、レッテルを瓶に貼る前に水でピンと張る工程のことで、
それは、昭和初期のラべル職人以外には通じない言葉らしい。

118 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 00:14:19.60 ID:Vkqae3ee.net]
個人的にパターンマッチがない言語で再帰にはつらみを感じる

119 名前:デフォルトの名無しさん [2015/08/13(木) 00:15:41.46 ID:AIiQbQBJ.net]
>>116
常識で考えろよ、昭和初期のラベル職人以外には通じないことを
ここで言うと思うか?バカじゃね。

120 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 00:16:00.68 ID:NebXzry6.net]
>>116
もう何の話かわからないけど、無駄に知識がついてしまった



121 名前:デフォルトの名無しさん [2015/08/13(木) 00:17:24.90 ID:AIiQbQBJ.net]
>>117
パターンマッチはifで書けばいいし、再帰はループで書けばいい。
いきがるな。

122 名前:デフォルトの名無しさん [2015/08/13(木) 00:18:56.16 ID:AIiQbQBJ.net]
ループで書けるものを再帰で書くやつって結局ヒッピーなんだよね。
ラリってるだけ。

123 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 00:23:14.84 ID:Vkqae3ee.net]
>>120
ifはパターンマッチ漏れをコンパイラが警告してくれないんやで
val a = list match {
case Nil => Nil
case head :: tail => tail
}

をifで書くと
var a;
if(list.isEmpty){ a = Nil } else { a = list.tail }
だろ 辛い

124 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 00:24:32.15 ID:NebXzry6.net]
>>117
JavaScriptならswitch(true)で頑張れば、ある程度は代替できそうですが、
基本的に静的型言語じゃないと真価を発揮できない気がしますね

125 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 00:24:38.47 ID:Vkqae3ee.net]
>>121
言語の違い、データ構造の違い

126 名前:デフォルトの名無しさん [2015/08/13(木) 00:27:11.91 ID:AIiQbQBJ.net]
>>124
ループを再帰で書く奴はミーハーで頭の中ハコスカなだけ

127 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 00:28:36.37 ID:FUyksqfE.net]
アホばっか
再帰的なアルゴリズムなら再帰を使えばいいし
反復なアルゴリズムならループを使えばいいし
どちらでもいいなら気分でかけばいいじゃん?
どっちか一方しか使わない使えないでは話にならん

128 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 00:33:41.96 ID:Vkqae3ee.net]
ループを再帰で書くというのがなんか違う

むしろ最初に再帰が浮かび後からループにいやいや書き換えるのではないか

129 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 00:38:27.39 ID:FUyksqfE.net]
>>127
アルゴリズムの考え方が先行して考えられると思うけど

130 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 00:57:49.87 ID:NebXzry6.net]
>>128
ループや再帰処理それ自身がアルゴリズムなので、
強いて依存先として挙げるならデータ構造じゃないかと



131 名前:ID:JsRAlNhV mailto:sage [2015/08/13(木) 01:30:53.70 ID:1C0y4JfF.net]
ちょっと深夜のランニングをしてきたわけだが、誰にレスするべかな?
反論者と擁護してくれる人の両方がいるな。

132 名前:デフォルトの名無しさん [2015/08/13(木) 01:35:10.57 ID:G0UckYXU.net]
末尾再帰云々言ってる人は、コンパイラがループに変換してくれるから
再帰を使うべきって話ですか?

133 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 01:35:43.95 ID:1C0y4JfF.net]
>>113
> レッテル張り

全くだね〜w

>>115
> ここは言語の違いだと思うけどjavascriptみたいな手続き型で再帰を特にサポートしていない言語は
> 再帰は基本的に使わない方がいいけど

というか逆だね。(一部の?)関数型言語のような、
ループを再帰よりも書きづらくしているものに限って言えば、
再帰を使うしか無いよ。仕方なく。

そういう言語以外は、再帰よりもループのほうが簡単に書ける。
(データ構造自体が再帰に適している場合は除く)

> ループだとそのコードみたいに破壊的代入が含まれるし
破壊的代入はするよりもしないほうがいいのは確かで、
俺もコードレビューなどで破壊的代入はするなって言ってるけど、
それは方針であって絶対的なもんじゃない。
破壊的代入をしたほうがわかりやすい場合もある。
よく言われるように手段と目的を履き違えるな問題だよ。

134 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 01:37:43.32 ID:1C0y4JfF.net]
>>126
> どっちか一方しか使わない使えないでは話にならん

俺もそれを言ってる。

再帰を知った奴がなんでも再帰を使って
解こうとしている。それに対して警告してる。
まだまだだよって。

135 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 01:38:45.50 ID:1C0y4JfF.net]
>>131
> 末尾再帰云々言ってる人は、コンパイラがループに変換してくれるから

↓ 俺が最初のほうで書いたレスw

24 自分:デフォルトの名無しさん[sage] 投稿日:2015/08/11(火) 18:24:05.65 ID:Ghx6BuLg
ループで実装する

(意味なく)再帰にしたい!

再帰にするとスタックがー、関数呼び出しがー、どうのこうの

末尾最適化される再帰にすればいいんだぜ!フフン

末尾最適化されるような再帰コードを書く

コンパイラがループの実装に戻す


結論

人間がループを再帰に変換し、
コンパイラが再帰をループに戻すという無駄!

136 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 01:43:20.43 ID:1C0y4JfF.net]
>>127
> むしろ最初に再帰が浮かび後からループにいやいや書き換えるのではないか

女性の列の中から男の娘を探しなさいって言われた時、
前から一人づつ見ていくという方法を思いつく人は多くいると思うが、

俺「一人だけ確認した。あとは俺に頼む」→俺「はーい、わかりました。俺も同じことをしまーす。」→俺「以下同文」

という考え方をする人は滅多に居ないと思うが。

137 名前:まーた連続書き込み規制だよ mailto:sage [2015/08/13(木) 01:50:39.52 ID:kS/o56L+.net]
>>117とか>>120とか>>122とか>>123

そういう場合、switchを使うんだけど
ちょっと数が増えただけで、循環的複雑度を調べるツールで
複雑だって言われるんで、これぐらいいいじゃねーかと思いながら
(※注 そのツールを導入したのは俺wしきい値を8に設定してるのも俺w)

関数テーブル呼び出し的なコード(意味わかるよね?)に書き換えるんだけど、
そうしたらやっぱり前よりわかりやすくなって、
やっぱりswitchいらねーか、とか思ってしまうw

関数テーブル呼び出し的なコードにすれば、パターンマッチ漏れは
nullを関数呼び出しすることになって、実行時エラーになってはくれるよ。

138 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 01:54:14.37 ID:NebXzry6.net]
元から再帰で無理矢理書くことを勧めてる人は、そういないんじゃないかと

私は相手をその手の人間と決め付けて話す事が、
おかしいといってるだけですよ

139 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 01:59:57.44 ID:kS/o56L+.net]
>>137
> 元から再帰で無理矢理書くことを勧めてる人は、そういないんじゃないかと
うん、こいつらぐらいかな? 適切なものを選ぼうとせずに
何でも再帰、再帰のほうがわかりやすい。
再帰使うほうが頭いい、(理由ないけど)普通に再帰だわ
とか言ってる人。

25 名前:デフォルトの名無しさん[] 投稿日:2015/08/11(火) 20:07:51.21 ID:SPQSl72c [2/2]
再帰のほうがわかりやすいと思えない子が

26 名前:デフォルトの名無しさん[sage] 投稿日:2015/08/11(火) 20:55:40.81 ID:I9e7/X97 [1/2]
再起が得意かどうかで頭の良さが決まる

33 名前:デフォルトの名無しさん[] 投稿日:2015/08/11(火) 23:39:17.34 ID:BomPGBV/ [2/2]
再帰苦手なのは練習不足なだけ
理解が早いのは完全に地頭がいいだけじゃね?

74 返信:デフォルトの名無しさん[] 投稿日:2015/08/12(水) 23:00:43.40 ID:ALDJfVhA [5/11]
>>73
>だけどデータがリスト構造なだけなら
>普通にループを使ったほうがわかりやすい。

んなわけねーだろ
普通に再帰使うわ

140 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 02:00:23.27 ID:NebXzry6.net]
>>135
それってfoldかfilterで良くないですか?
そう言う意味で、再帰よりループのが不要に見えるんですが



141 名前:デフォルトの名無しさん [2015/08/13(木) 02:03:39.26 ID:G0UckYXU.net]
まだ関数型言語の時代は来てないんで、手続型前提で良いんじゃないですかね。

142 名前:デフォルトの名無しさん [2015/08/13(木) 02:06:24.18 ID:G0UckYXU.net]
関数型がうまく機能する時代にはC++のようなマルチパラダイムの言語に取り込まれて
結局、純粋な関数型言語の時代は来ないんじゃないですかね。

143 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 02:07:07.66 ID:kS/o56L+.net]
> それってfoldかfilterで良くないですか?
> そう言う意味で、再帰よりループのが不要に見えるんですが

え? 君、foldかfilterでいいにしても、再帰の話してないよね?
foldもfilterもループでも再帰でも書けるわけだから。

高階関数呼び出しを行うそれらの関数を使えば
ループ(または再帰)が不要になるっていう話なら別に否定してない。

俺もよく使うし、上の方でも書いたよ。

>>54
> 最近ではMIMEメールのパースとか、連想配列の
> 全ての値の処理とかで使ったかな。
>
> 再帰を使うことはめったにない。そしてミスをしやすい所でもある。
> だから再帰を使うときは、再帰を考慮しなくていい形に置き換えるようにしている。
> つまりJavaScriptでいうmapやreduceの形にする。再帰部分と処理部分に分けて再帰部分を隠ぺいする。
> 通常書くのはコールバックで呼ばれる処理部分のみ。
> そうすることで可読性も大きく上昇する。

再帰はわかりづらいからtraverseみたいな形にすることで再帰を内部に隠ぺいする。
ループを内部に隠蔽してfoldかfilterがあればループが不要だというのなら、
同じ理由で、再帰を内部に隠蔽したtraverseで良いから、再帰は不要だって言えばいいの?

144 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 02:13:00.97 ID:NebXzry6.net]
>>142
必要性の比較として、その手の関数で簡単に書き下せるloopの方が、
再帰より不要ではないですか?と言う意味ですよ

実装としては、さすがにループが完全になくなるとは思ってません

145 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 02:15:06.80 ID:kS/o56L+.net]
そういや高階関数使える言語ばっかりになったよな。

>>141
> 結局、純粋な関数型言語の時代は来ないんじゃないですかね。

俺もそう思う。

高階関数は便利だけど、純粋な関数型言語まではいらないかな。
あとScalaでいうval、再代入不可能な変数も欲しいけど。

146 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 02:19:20.99 ID:NFzWJ2Cc.net]
何でこんなに伸びてるの…

147 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 02:19:45.60 ID:kS/o56L+.net]
>>143
そもそもの話が、「ループで簡単に書けるようなもの」を
再帰でわざわざ書くなって話なんだよ。

正確に言うと、再帰を使わないでいいような処理に
再帰を使うなという話。

だから、その手の関数で簡単に書き下せる処理に
再帰を使うなっていう話でも有る。

148 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 02:20:52.90 ID:kS/o56L+.net]
>>145
話が再帰してるから

(ループをわざわざ再帰にしてみました!)

149 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 02:24:57.75 ID:NebXzry6.net]
>>146
では、それを踏まえた上でどう思います?

150 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 03:17:20.09 ID:kS/o56L+.net]
>>148
最初っからおんなじ
再帰は可読性悪いんで
使わずに済むなら使わない方がいい。



151 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 03:18:50.05 ID:WDxyRHha.net]
あとどうしても必要な場合は

152 名前:
内部に隠蔽して、再帰であると意識せずに
また再帰のコードを見ずに、処理できるようにした方がいい。
[]
[ここ壊れてます]

153 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 03:30:05.42 ID:NebXzry6.net]
>>149
いえ、そうではなく、二者択一で
再帰とループで、必要性が高いのはどっちだと思います?
もちろん、高階関数や各種操作関数での置き換えを踏まえた上での話です

必要と思うならどういう場面なのかなと

154 名前:>>150 mailto:sage [2015/08/13(木) 03:31:16.05 ID:NebXzry6.net]
最後の行は削除忘れです

155 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 03:36:08.86 ID:WDxyRHha.net]
>>151
お前バカじゃね?
足し算と掛け算どっちが必要かって
言ってるようにしか聞こえん。
適切なものを使えよ。

156 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 03:39:48.62 ID:WDxyRHha.net]
そういや実務で再帰使う必要せいってねーな。
あっても隠蔽するから両手で数えられるほどしか無い。
片手でもいけるかもw

157 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 03:51:07.78 ID:NebXzry6.net]
>>153
私はそこまで一般化はしてないですし、適材適所も否定してません
それと必要性の比較も関係ありませんよ
例えばgoto文も適材適所ですが、必要性は低いと思ってます

再帰がループと同程度に必要と思うなら、そう言ってくれればいいです
違う場合に、その先の話がしたいだけなので

158 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 04:15:21.85 ID:NebXzry6.net]
ループが本当に必要な部分というのを、議論してみたかったんですが
どうあっても再帰は不要といいつつ、ループが必要とは言わないんですね…

159 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 04:27:48.44 ID:WDxyRHha.net]
>>155
実践では再帰はあまり使いません。
必要性の話をするのなら
それが現実では?

160 名前:デフォルトの名無しさん [2015/08/13(木) 07:42:46.93 ID:GBQWWFg+.net]
クイックソートもループで書くんですか?



161 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 07:48:57.17 ID:FXSompvo.net]
アスペかよ

162 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 08:21:16.88 ID:Iax2S8IU.net]
>>158
実用的なクイックソートはループ。

まさか再帰でしか実現できないなんて考えとるんか?

163 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 08:52:19.31 ID:GBQWWFg+.net]
>>160
再帰より可読性の高い、ループでのクイックソートの実装は寡聞にして知りません。

164 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 09:30:01.18 ID:Iax2S8IU.net]
ループ方式も可読性は高い。
特別なことはやらないから、誰でもすぐ実現できるはず。

Cどころか昔のVBのようなへぼ環境でも
何百万ものデータを高速にソートできてしまう。

165 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 09:53:04.16 ID:GBQWWFg+.net]
例えばこれ
https://github.com/lattera/glibc/blob/master/stdlib/qsort.c
本来の再帰アルゴリズムを、非再帰で記述するために状態を自前のスタックで管理しなきゃならない。
余計なコードが必要な分、可読性は低いですね。

166 名前:デフォルトの名無しさん [2015/08/13(木) 10:07:42.74 ID:Q4WJ33HH.net]
>>163
FSF、Microsoft、そしてAppleが再帰を避けるのは何故か考えてみては。

167 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 10:10:35.79 ID:wsd38m6J.net]
再帰関数をスタック無視して設計するような馬鹿じゃなけりゃ、
どっちでもいいよ。
金太郎飴をループで切るか再帰で切るか、程度の話しかしてない
みたいだしな。その関数がその構造のどこまでのデータを扱うのか
ってことを意識してりゃ別にいい。
再帰でよその子をいじったりとかするのは馬鹿のやること。

168 名前:デフォルトの名無しさん [2015/08/13(木) 10:13:00.13 ID:1x08JE5T.net]
論点がずれてないか?
>>163は可読性について論じているのに

169 名前:デフォルトの名無しさん [2015/08/13(木) 10:27:03.54 ID:Q4WJ33HH.net]
>>166
わざわざglibcのソース引っ張り出してるとこからして、本人も言いたいことが自分で分かっていないのでは?

Cで再帰するコードを書けば、たいていのチェッカが警告するし、品質保証からお叱りを受けるはず。
やってはいけないことの一つとして、ほとんどの企業で明文化されているはずです。

そして良く知られるMISRA-Cも通りません。

こういう状況下で、glibcのソースを引用して再帰するべきと主張するのはおかしい。
glibcでも再帰は避けている、再帰するべきでないという主張になるのが当然だと思う。

そうなっていないという事は、本人が一番自分の主張をわかっていない。
と思うのです。

170 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 10:30:12.83 ID:NebXzry6.net]
さすがにこれを可読性が高いとは言うのは無茶じゃないかと



171 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 10:30:37.05 ID:Iax2S8IU.net]
可読性が悪いかどうかじゃなく、
再帰の場合よりも良くなくてはいけないと?

理解困難なコードでなく実用性があるのなら採用するでしょ。

プログラマはソート処理のコードは使いまわして
比較関数を用意すればいいだけだし。

172 名前:デフォルトの名無しさん [2015/08/13(木) 10:32:46.72 ID:GBQWWFg+.net]
>>167
可読性の話をしてるんですが?

173 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 10:38:27.46 ID:WDxyRHha.net]
>>163
> 本来の再帰アルゴリズムを、非再帰で記述するために状態を自前のスタックで管理しなきゃならない。

だから適切なものを選べって言ってるじゃん。

誰が、再帰が適切なものまで、
ループにしろって言ったよ?

ループで済むものを再帰でやるなって話。

ほんと>>42で書いた4の段階のやつだなお前は。

174 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 10:40:07.80 ID:WDxyRHha.net]
>>169
> プログラマはソート処理のコードは使いまわして
> 比較関数を用意すればいいだけだし。

そういう場合、そのソートは何に使われるかわからないから
往々にして、速度が一番早い方法を選ぶんだよね。
つまりループで実装。

175 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 10:41:21.58 ID:A9RCljrX.net]
ソースがコンパイラにどう最適化されて実行時にどう動かされるかを考えてると
可読性の基準が変わってくるでしょ
再帰で触感的に記述できるのは再帰構造持ったアルゴであって
本来行うべき実行じゃないから非直観的なんよ

可読性として表現したい対象がそもそも違うのよね

176 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 10:42:13.58 ID:96XWMJC8.net]
実用向けだと可読性だけと言うわけにはいかないからなぁ
スタックオーバーフローを検出して適切にエラー処理するために自前のスタックにするとかは普通にあるし

177 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 10:43:10.07 ID:NebXzry6.net]
>>167
中身ちゃんと読んでますか?
このソース要素数が一定以上の場合、どうやらquicksortしない仕様で、
quicksort処理部もスタック使ってるようですよ

要素数で分けて安全性を保っているだけで、
処理そのものの安全性そのものは再帰と変わってません

178 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 10:47:32.08 ID:Iax2S8IU.net]
>このソース要素数が一定以上の場合、どうやらquicksortしない仕様で、

何言っとるんだ?

179 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 10:47:43.55 ID:WDxyRHha.net]
>>173
> ソースがコンパイラにどう最適化されて実行時にどう動かされるかを考えてると
> 可読性の基準が変わってくるでしょ

可読性の読みやすさって
人間の読みやすさだからw

コンパイラにとっては可読性関係ないよ
どんなに読みづらいコードでも
書いてあるとおりに解釈してくれる。

180 名前:デフォルトの名無しさん [2015/08/13(木) 10:48:35.29 ID:Q4WJ33HH.net]
>>175
自前のスタックを使っています。
確かにあなたのおっしゃる通り*自前の*スタックを使っています。

ですが再帰ではありません。



181 名前:デフォルトの名無しさん [2015/08/13(木) 10:48:36.95 ID:Q4WJ33HH.net]
>>175
自前のスタックを使っています。
確かにあなたのおっしゃる通り*自前の*スタックを使っています。

ですが再帰ではありません。

182 名前:デフォルトの名無しさん [2015/08/13(木) 10:51:04.09 ID:Q4WJ33HH.net]
C/C++で再帰を使うことが良くないマナーであることは、とっくの昔に
明文化された事実なんですよ。

手間がかかろうがなんだろうが、再帰を無くさなければならない。

そんなこと当たり前じゃないですか。

183 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 10:51:19.49 ID:GBQWWFg+.net]
>>164
glibcのqsortでもstack_node stack[STACK_SIZE]が溢れますね。
メモリ消費量は、再帰で書くとそれに加えて、リターンアドレスやフレームの保存領域が余計に必要になるだけですよね。

184 名前:デフォルトの名無しさん [2015/08/13(木) 10:53:38.16 ID:Q4WJ33HH.net]
>>181
じゃあ品証にそう言って噛みついてみては?

185 名前:デフォルトの名無しさん [2015/08/13(木) 10:55:16.00 ID:Q4WJ33HH.net]
こんな当たり前のことで今更何議論してるんだって話。

186 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 11:01:18.21 ID:Iax2S8IU.net]
>stack_node stack[STACK_SIZE]が溢れますね。


これは指定の番号のデータが、ソート結果として
第何番目になるかを出力させるといい。

つまり順番に数値を格納した配列を用意して
その要素をクイックソートの置き換え処理の対象にさせる。
また、

187 名前:比較関数もこれに対応したものを用意する。

この方式なら
int stack[STACK_SIZE]
を用意すればいいので、件数は多くても
メモリ消費量はそんなに必要にならない。
[]
[ここ壊れてます]

188 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 11:01:20.46 ID:GBQWWFg+.net]
>>171
>>54が言い出した「再帰は可読性が悪い」に対する反論なのですが。

189 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 11:01:38.29 ID:NebXzry6.net]
>>176
コメントとMAX_THRESHで追えば解ると思います
全くしないわけではないです

190 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 11:13:50.27 ID:GBQWWFg+.net]
>>184
非再帰版は再帰を自前のスタック管理でエミュレートしているだけなんだから、
同一データを、再帰版と非再帰版で実行すると再帰版の再帰の深さと、
非再帰版のstackの使用個数は同じになるに決まってるじゃないですか。



191 名前:デフォルトの名無しさん [2015/08/13(木) 11:15:13.87 ID:1x08JE5T.net]
再帰は普通につかうでしょ
OSとかの制作には向いてないってことで
普通のソフトならオーバーフローしない限り問題ない

192 名前:デフォルトの名無しさん [2015/08/13(木) 11:22:16.59 ID:Q4WJ33HH.net]
>>188
使いません。

193 名前:デフォルトの名無しさん [2015/08/13(木) 11:24:47.30 ID:Q4WJ33HH.net]
CERT C Secure Coding Standard、ISO/IEC TR 24772:2013、MISRA-C。
よく使われるガイドライン、規約で明示的に禁止されています。

C/C++で再帰は邪悪なのです。

再帰を使う人は悪人です。

194 名前:デフォルトの名無しさん [2015/08/13(木) 11:26:18.86 ID:1x08JE5T.net]
おれたちにとってそれを書いた人の意見が正しいわけじゃないから

195 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 12:51:43.10 ID:GBQWWFg+.net]
>>190
ウソつき。 禁止してるのってMISRA-Cだけですね。
CERT C Secure Coding Standard
Recursion can also lead to large stack allocations. Recursive functions must ensure that they do not exhaust the stack as a result of excessive recursions.

ISO/IEC TR 24772:2013
6.37.5 Avoiding the vulnerability or mitigating its effects
Software developers can avoid the vulnerability or mitigate its ill effects in the following ways:
+ Minimize the use of recursion.
+ Converting recursive calculations to the corresponding iterative calculation.
In principle, any recursive calculation can be remodeled as an iterative
calculation which will have a smaller impact on some computing resources but
which may be harder for a human to comprehend.
The cost to human understanding must be weighed against the practical
limits of computing resource.
+ In cases where the depth of recursion can be shown to be statically bounded
by a tolerable number, then recursion may be acceptable, but should be
documented for the use of maintainers.

196 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 12:54:40.29 ID:V/aggySn.net]
Scala だと末尾再帰が推奨されてる感じだけど

197 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:05:26.51 ID:WDxyRHha.net]
特定の言語特有の例外でしょうね

198 名前:デフォルトの名無しさん [2015/08/13(木) 13:06:35.36 ID:t3mydoM3.net]
特有というか関数型言語

199 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:12:01.20 ID:WDxyRHha.net]
でも推奨してるのはScalaだけなのでしょう?

200 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:12:01.28 ID:A9RCljrX.net]
おれの予想だとそろそろ
糞みたいな本のコピペ宣伝がくるね



201 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:13:19.26 ID:WDxyRHha.net]
>>197
それは、押すなよ、押すなよってやつですか?
それとも自分でコピペして、ほら俺の言ったとおりだった(ドヤ顔)を
やるための布石ですか?

202 名前:デフォルトの名無しさん [2015/08/13(木) 13:13:33.60 ID:GBQWWFg+.net]
クイックソートは再帰版の方が可読性が高い。
これに異論はありますか?

203 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:14:50.27 ID:aB+CmHXz.net]
>>195も言ってるが関数型言語のような破壊的代入を避けることが推奨の言語は、
ループは再帰で表現するのが推奨
Scala特有とか意味わからん

204 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:19:18.15 ID:WDxyRHha.net]
>>199
中途半端な質問するなよw

クイックソートは再帰版の方が可読性が高い。
バブルソートは再帰版の方が可読性が高い。
マージソートは再帰版の方が可読性が高い。
これに異論はありますか?

やるならこれぐらいやれよw
その言い方だとクイックソートだけしか勝ち目がないと
自覚しているかのようだぞ。

なお、ソートの種類には以下の様なものが有るらしい。
https://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%BC%E3%83%88

バブルソート、シェーカーソート、コムソート、ノームソート、選択ソート、挿入ソート
シェルソート、2分木ソート、ライブラリソート、マージソート、In-place マージソート
ヒープソート、スムースソート、クイックソート、イントロソート、ペイシェンスソート
ストランドソート、奇偶転置ソート、シェアソート

半分も知らんなw

205 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:20:57.51 ID:WDxyRHha.net]
>>200
推奨とか、破壊的代入を禁止するという制約のために
選択肢がないだけに見えますが。

破壊的代入を禁止することが、
必ずしも可読性を高めるとは限らないので。

206 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:24:34.58 ID:NebXzry6.net]
>>201
fold mapでループは消えますので、再帰より不要ですね(煽り)

207 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:27:20.56 ID:WDxyRHha.net]
>>203
fold mapによって消えるものがなぜループだと?
fold mapによって再帰が消えるのではないのですか?

208 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:28:32.66 ID:W1EX3EBl.net]
やっぱりfold mapの実装はループであるべきだって
自覚してるんでしょうね(煽り)

209 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:30:40.85 ID:GBQWWFg+.net]
>>201
>>54
> 普段はやはり再帰のコードは書くべきじゃないよ。
> 可読性悪いからね。

これが間違いであることは、反例を1つ示せば十分ですよね。足りないというなら、
ID:Q4WJ33HH氏がドヤ顔で言い出したISO/IEC 24772:2013にも
In principle, any recursive calculation can be remodeled as an iterative
calculation which will have a smaller impact on some computing resources but
which may be harder for a human to comprehend.
The cost to human understanding must be weighed against the practical
limits of computing resource.
って明記されてるし。

210 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:34:22.81 ID:W1EX3EBl.net]
"普段は" って書いてあることから
普段に当てはまらない場合は違うと言ってるわけで、
反例があるってことは、最初から言ってることですね。



211 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:43:25.91 ID:GBQWWFg+.net]
>>207
その「普段」は発言者の彼によると、「再帰を繰り返しに置き換える」ので、クイックソート非再帰版が「普段」ですよね。

> 再帰を使うことはめったにない。そしてミスをしやすい所でもある。
> だから再帰を使うときは、再帰を考慮しなくていい形に置き換えるようにしている。

212 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:44:15.15 ID:W1EX3EBl.net]
>>208
その発言者は私ですが、普段というのは
日々の仕事の話ですよw

普段あなたは何をしてるのですか?
の普段です。

213 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:47:30.00 ID:W1EX3EBl.net]
クイックソートの話で言えば、
普段はクイックソートの実装などせずに

予め用意されたソート関数、つまり高階関数を引数にしたソート関数を
呼び出すだけなので普段は再帰を使ったコードを書きません。

>>203の発言風に言うと、
sortで再帰は消えますので、再帰は不要ですね(煽り)

214 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:47:49.82 ID:GBQWWFg+.net]
>>209
「普段」はクイックソートのように再帰版の方が可読性の高いものを、非再帰版に書き直さないのですか?

215 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 13:50:17.90 ID:W1EX3EBl.net]
>>211
普段は再帰は可読性が低いので、
再帰だとわからないように
sort関数のようなものを作ります。

再帰が可読性高かったら、
わざわざsort関数なんて作りませんよw

216 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 14:02:03.63 ID:GBQWWFg+.net]
>>212
再帰版クイックソートは可読性が低いという主張ですね。

>>207と矛盾しますが。
> 普段に当てはまらない場合は違うと言ってるわけで、

217 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 14:09:44.52 ID:NebXzry6.net]
>>204
え…?再帰構造にmap使うんですか?
かなり効率悪いと思いますが

218 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 14:23:38.44 ID:W1EX3EBl.net]
>>214
え?そんな話してませんよ。

話の内容を整理しましょう。

fold mapによって消えるものがなぜループだと
思っているということは、fold mapが再帰ではなく
ループで実装されていると思っているからでしょう?

fold mapを使えば、ループが要らないっていうのはそういうことですね。
もしfold mapの中身が、ループではなく再帰で実装されていると思っているのなら、
fold mapで消えるのは再帰だと考えるはずです。

だから、ははん、こいつはループを使ったほうが適切な問題だって
わかっていると言ったんです。

最初っから言ってるように、適切なものを使う。
単なるリスト構造であればループで良い。
再帰的な構造であれば再帰使えばいいと言ってます。

219 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 14:27:29.97 ID:W1EX3EBl.net]
>>213
> 再帰版クイックソートは可読性が低いという主張ですね。

全く違います。

再帰を使ったコードは可読性が低いので、
sort等の関数を使って再帰を隠蔽するというのが
私の主張です。

何回も説明したはずですが?

「普段」というのは>>209で書いたように、
日々の仕事のことですから、普段は再帰は使いません。

使うことがあっても内部で隠蔽されたsort関数などを使うし、
自分で隠蔽するので、普段は再帰は使いません。

220 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 14:29:35.52 ID:NebXzry6.net]
>fold mapによって消えるものがなぜループだと
>思っているということは、fold mapが再帰ではなく
>ループで実装されていると思っているからでしょう?
全然違います
ループに代替可能、かつ効率が上がる可能性があるからです
mapの実装がループって…ループや再帰で実装はできますが、
逐次処理に書き下したらmapの優位性なくなりますよ

その下は間違った前提で話してるのでスルーします



221 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 14:31:12.41 ID:NebXzry6.net]
安価忘れ >>215
間違い訂正:ループに代替可能 → ループを代替可能

222 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 14:39:15.29 ID:W1EX3EBl.net]
>>217
もしかして、mapの実装をmapで書いてると言った人ですか?w

mapというのは写像のことです。
f: A → B のことです。

プログラミング的に書くならば、
B = f(A) という形になってないとmapではありません。
ループもしくは再帰でmapを実装するのですよ。

もっともこの場合は、ループで実装するのが適切だから
再帰は使いません(何度も私が言ってます。道具は適切に使いましょう。)

そして逐次処理に書き下しするって何の話してるのですか?
逐次処理の反対は並列処理ですが、今並列か逐次かの話なんかしていましたかね?
ループも再帰も逐次処理ですし。

223 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 14:49:38.43 ID:NebXzry6.net]
>>219
mapはあなたの言う通りただの写像ですから、
それだけで逐次か並列かを縛るものじゃないですよ

再帰処理という意味なら、必然的に並列化して分割統治できるので、
どう見ても再帰が有利ですね

224 名前:デフォルトの名無しさん [2015/08/13(木) 14:52:27.40 ID:t3mydoM3.net]
>>215
いやだからリストは最も基本的な再帰的なデータ型だから。。
木より

225 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 14:56:24.24 ID:W1EX3EBl.net]
全てのループは再帰で表現した方がいいというのであれば
全てのループは再帰で変換可能なので、
全てのループは並列化して分割統治できるということになりますが?

何度も言ってるように、適切なものを使いましょう?
ループを使ったほうが良い場合は
わざわざ再帰にする必要はないのですよ。

ちょっと出かけなきゃならないので、wikipedia貼って終わらすけど、
再帰だからって並列化できるとは限りません。

https://ja.wikipedia.org/wiki/%E4%B8%A6%E5%88%97%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0
再帰的でありながら並列化が非常に難しい問題もある。例えば、グラフにおける深さ優先探索がある。

226 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 14:57:39.52 ID:W1EX3EBl.net]
>>229
再帰の中でも一番シンプルなデータ構造です。
シンプルなデータ構造にはシンプルなループを使いましょう。

227 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 15:00:06.78 ID:W1EX3EBl.net]
あ、一応煽っておこう。

再帰、再帰ばかり言ってないで、
最近何処かに出かけたか?w

引きこもってばかりだと、
体が細菌だらけになっちゃうぞw

228 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 15:09:12.83 ID:NebXzry6.net]
>>222
主張してない事を主張として反論する事が多いですね…

逐次処理が必須なものは、並列化できなくて当然ですね
あえて挙げる意味ありますか?

ループと逐次処理で、並列の分割統治はできません
並列した時点でもうループではなく、並列、または再帰的処理です

そもそも自分で高階関数でいいと言ってるんですから、
逐次処理のループは消しましょう

>>224
もう本当ただの煽りですねw

229 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 15:16:09.30 ID:GBQWWFg+.net]
>>216
> 全く違います。

これと
> 再帰版クイックソートは可読性が低いという主張ですね。
これ
> 再帰を使ったコードは可読性が低いので、
> sort等の関数を使って再帰を隠蔽するというのが
の、どこが違うのでしょう?

再帰版クイックソートは非再帰版に比べて、可読性が低いのですか? 高いのですか?

230 名前:デフォルトの名無しさん [2015/08/13(木) 15:44:30.69 ID:t3mydoM3.net]
>>223
いやどっちがシンプルな方法かは状況によりますし
そもそもリストの再帰でシンプルにならなかったら別のデータ構造使うべし



231 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 15:53:27.98 ID:uKHAyuPa.net]
仮想関数もだが
再帰関数は自己満足でしかないな

232 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 16:00:20.34 ID:Iax2S8IU.net]
仮想関数は自己満足じゃないぞ。

実用的なプログラミング手法

233 名前:デフォルトの名無しさん [2015/08/13(木) 16:13:22.44 ID:t3mydoM3.net]
普通のオブジェクト指向言語だったらデフォルトで仮想関数

234 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 16:29:24.52 ID:wsd38m6J.net]
どっちも相手の言い分を聞く気はなく、反論する付け入りどころを
つくだけの議論に価値はないから、メアドでも交換して、
勝手にメールでやってくんない?

235 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 17:14:18.17 ID:dAU/S6bT.net]
再起なんてプログラマの基礎知識だろ。
デザイナか底辺コーダーみたいなヤツらばっか

236 名前:デフォルトの名無しさん [2015/08/13(木) 17:41:32.08 ID:FeXmcCf7.net]
探索も書かないようなウンコーダーに再帰は不要

237 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 17:55:50.75 ID:A9RCljrX.net]
あーいえばコーダー

238 名前:デフォルトの名無しさん mailto:sage [2015/08/13(木) 19:13:46.18 ID:ZdpNokWx.net]
>>18
ループはコンパイル時に最適化かかるから高速化しやすい

239 名前:デフォルトの名無しさん [2015/08/13(木) 19:38:20.24 ID:4z/i7w/x.net]
再帰完全否定してるダメプログラマはとりあえずハノイの塔ループで解いて来いよwwww

240 名前:デフォルトの名無しさん [2015/08/13(木) 23:05:53.46 ID:TPLbUV1y.net]
gcc の qsort が非再帰なのは単に速度を重視した結果じゃないの?
速度も含めて、再帰と非再帰でそんなに大騒ぎするほどの違いがあるかなあ。



241 名前:デフォルトの名無しさん [2015/08/13(木) 23:12:53.85 ID:WInk48Wa.net]
何言ってんだコイツ。

242 名前:デフォルトの名無しさん [2015/08/13(木) 23:47:23.70 ID:WInk48Wa.net]
>>192
再帰使うなと書いてあるだろ。
何言ってんだお前。

243 名前:デフォルトの名無しさん [2015/08/14(金) 00:02:47.08 ID:She38G+m.net]
何言ってんだおじさんこんばんわ

244 名前:デフォルトの名無しさん [2015/08/14(金) 00:31:35.66 ID:bS+eLMvH.net]
再帰は使うな。

これが国際ルール。

245 名前:デフォルトの名無しさん [2015/08/14(金) 00:38:24.26 ID:30JcjEEE.net]
>>237
ID:W1EX3EBl氏曰く、可読性が悪いから許容出来ない。らしい。

246 名前:デフォルトの名無しさん [2015/08/14(金) 00:45:15.19 ID:She38G+m.net]
つまり、再帰を使うやつっていうのはジュリアナでケンメリなんだよね

247 名前:デフォルトの名無しさん [2015/08/14(金) 00:49:42.60 ID:EjQiuBiC.net]
だから言語によるっつーの

248 名前:デフォルトの名無しさん [2015/08/14(金) 00:53:34.88 ID:She38G+m.net]
そんなバナナ

249 名前:デフォルトの名無しさん [2015/08/14(金) 02:23:00.05 ID:bS+eLMvH.net]
>>244
再帰を使わなければならない言語は実用性ないからやめとけ。

煽ってるように思うかもしれないが、10年後に思い返してみ。
その通りだったとわかるから。

250 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 03:21:13.76 ID:EMHxFo3V.net]
結局関数モデルより命令型計算モデルのほうが直感的で素直なんだよね
関数型を選ぶのはコンプレックスとか本来の目的以外がモチベーションになってる



251 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 04:02:13.98 ID:wyMAq0xx.net]
と、コンプレックスこじらせてた人が申しております

252 名前:デフォルトの名無しさん [2015/08/14(金) 04:50:19.83 ID:MLcHO6rW.net]
関数型モデルより命令型が直観的とかいうやつがいることが信じられん

253 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 05:07:39.58 ID:QRcaU/9J.net]
このスレの再帰のキティ害はレベル低すぎ

英語は読み間違えるし、コードを読む力が皆無だし
再帰のコードをループに直せないし、
何よりも再帰を使用してはいけないことが理解できない。

プログラマの基礎学力を欠いてる。

254 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 05:20:19.69 ID:wyMAq0xx.net]
この人何ですぐID変えるん?

255 名前:デフォルトの名無しさん [2015/08/14(金) 05:46:48.29 ID:SrkbsMCI.net]
>>250
読み間違えるんじゃなくて、読んでないんだろ。

何となくそれっぽいこと書けばいいみたいな。

再帰の危険性を指摘した文章を引用して、再帰するべきであると主張してるし。
自前スタックによる実装を示して、再帰してると主張するし。
しかも、読んでないだろとか言いがかりつけてくるし。

打ち負かすのが目的だから話にならない。

CERT CC読むだけでも再帰がなぜいけないのかわかるだろうに。

256 名前:デフォルトの名無しさん [2015/08/14(金) 05:53:10.80 ID:SrkbsMCI.net]
それじゃそろそろまとめます。

2chコーディング規約第一条、再帰の禁止。
再帰を用いる者は、50万円以上の過料、あるいは10年以上の禁固刑と処す。

257 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 05:55:31.01 ID:wyMAq0xx.net]
>>252
その人禁止されてないって言ってるだけじゃない
言いがかりばっかりだね

258 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 05:56:35.55 ID:wyMAq0xx.net]
本物のキチガイだった

259 名前:デフォルトの名無しさん [2015/08/14(金) 06:03:17.11 ID:SrkbsMCI.net]
ユーザー入力において、0終端文字列を仮定してはならないだろ?
再帰の禁止はそれと同じレベルの話。
紀元前においてはそれで良かった。
古い教科書には、再帰による例だって載っているだろう。
昔、0終端を仮定していたようにな。

しかし、現在ではそれは良くないマナー。
全てのセキュリティ勧告が再帰を警告し、すべての規約が再帰を禁止している。

2chにおいては禁固刑になるほどの悪徳とされている。

260 名前:デフォルトの名無しさん [2015/08/14(金) 09:48:40.23 ID:IQ5ciGpN.net]
だから言語によるっつーの



261 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 13:36:50.53 ID:S4Thnq8W.net]
再帰を禁止しているのはMISRA-Cだけですね。そしてMISRA-Cはmallocも禁止していますね。
あれはC言語のサブセット。

262 名前:デフォルトの名無しさん [2015/08/14(金) 15:18:36.00 ID:MLcHO6rW.net]
禁止してるんじゃなくてスタック溢れがないように保証せよ、でしょ
普通にTCRで書けばいいだけ。それどころかそこに

> In principle, any recursive calculation can be remodeled as an iterative
> calculation which will have a smaller impact on some computing resources but
> which may be harder for a human to comprehend.
> The cost to human understanding must be weighed against the practical
> limits of computing resource.

ループは人間が理解するのが先より難しいけど人間が理解するコストは
計算機資源の限界と衡量しなきゃだめよ、って書かれてる。
再帰のほうが人間には読みやすい、ってさ

263 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 15:42:19.07 ID:S4Thnq8W.net]
ああ、読解力の無い人は
| ウソつき。 禁止してるのってMISRA-Cだけですね。
| CERT C Secure Coding StandardもISO/IEC 24772:2013も禁止なんかしていませんね。
| 証拠↓
って書かなきゃ読み取れないのか。

264 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 16:12:00.57 ID:yjzzXtw+.net]
MISRA-Cみたいに制限だらけの言語で仕事するぐらいならプログラマやめる

265 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 17:36:18.62 ID:lAGFmjya.net]
そりゃ助かる

266 名前:デフォルトの名無しさん [2015/08/14(金) 21:22:39.45 ID:JKvGE0+H.net]
2chコーディング規則読め。

第一条で再帰が禁止されている。

267 名前:デフォルトの名無しさん mailto:sage [2015/08/14(金) 21:42:25.71 ID:tycV63/U.net]
>>261
アレを規定せざるを得なかった闇がある

MISRA本はその闇のエピソード、笑いあり涙ありの
感動ストーリーを綴っているんだ

268 名前:デフォルトの名無しさん [2015/08/14(金) 23:59:17.48 ID:XChvySBs.net]
こいつを見てくれ。どう思う?

static void sort(int[] a) {
 sort(a, a.length - 1);
}

static void sort(int[] a, int i) {
 if (i < 0) {
  return;
 }

 sort(a, i, 0);
 sort(a, i - 1);
}

static void sort(int[] a, int i, int j) {
 if (j >= i) {
  return;
 }

 if (a[j] > a[j + 1]) {
  swap(a, j, j + 1);
 }

 sort(a, i, j + 1);
}

static void swap(int[] a, int i, int j) {
 int t = a[i];
 a[i] = a[j];
 a[j] = t;
}

269 名前:デフォルトの名無しさん [2015/08/15(土) 00:18:15.82 ID:f9Sa8wCp.net]
ずいぶん効率悪そうなソートだね。
たとえ正しく動くとしてもこれはないだろう。
でも聞きたいのはそういうことじゃないのかな。

270 名前:デフォルトの名無しさん [2015/08/15(土) 00:22:42.84 ID:JxzjZBTN.net]
>>266
どうしてこれはないと思うのかね?(ヒント:再帰だから)



271 名前:デフォルトの名無しさん [2015/08/15(土) 01:24:19.54 ID:f9Sa8wCp.net]
>>267
馬鹿馬鹿しいけど返事してやるよ。
O(n^2) だからだ。コード書く以前の問題だよ。

272 名前:デフォルトの名無しさん mailto:sage [2015/08/15(土) 01:34:17.46 ID:vCc4fVXG.net]
せめてクイックソート

273 名前:デフォルトの名無しさん mailto:sage [2015/08/15(土) 01:44:24.34 ID:+Mrs40dU.net]
再帰推奨の奴の程度が知れてしまったな。
こんなひどいアルゴリズムでドヤ顔とかw

274 名前:デフォルトの名無しさん mailto:sage [2015/08/15(土) 01:48:48.57 ID:WFfeEk5g.net]
バブルソートは再帰だと汚い!って言いたかったのに
再帰どころか分割しすぎのクソコードで自爆ww

static void sort(int [] a){
 sort(a, a.length -1, 0);
}

static void sort(int [] a, int i, int j){
 if( j < i ){
  int t = a[i];
  a[i] = a[j];
  a[j] = t;
  sort(a,i,j+1);
 }
 else if( i > 0 ){
  sort(a,i-1, 0);
 }
}

275 名前:デフォルトの名無しさん mailto:sage [2015/08/15(土) 01:49:45.86 ID:WFfeEk5g.net]
おっと、ミスってた

static void sort(int [] a, int i, int j){
 if( j < i ){
  int t = a[j];
  a[j] = a[j+1];
  a[j] = t;
  sort(a,i,j+1);
 }
 else if( i > 0 ){
  sort(a,i-1, 0);
 }
}

276 名前:デフォルトの名無しさん [2015/08/15(土) 05:15:13.18 ID:IGI9KIAb.net]
再帰が有能なことはハノイの塔が証明してるって。
再帰
# coding: utf-8

def hanoi(disk_number, f, t, w, tower_dict):

if disk_number > 0:
hanoi(disk_number-1, f, w, t, tower_dict)
tower_dict[t].insert(0, tower_dict[f].pop(0))
print((tower_dict['left'], tower_dict['center'], tower_dict['right']))
hanoi(disk_number-1, w, t, f, tower_dict)


if __name__ == '__main__':
disk_number = int(input())
tower_dict = {'left': [i for i in range(1, disk_number+1)], 'center': [], 'right': []}
print((tower_dict['left'], tower_dict['center'], tower_dict['right']))
hanoi(disk_number, 'left', 'right', 'center', tower_dict)

277 名前:デフォルトの名無しさん mailto:sage [2015/08/15(土) 08:34:36.98 ID:pcfePhGh.net]
趣味のプログラミングのお題だな。

278 名前:デフォルトの名無しさん mailto:sage [2015/08/15(土) 08:40:27.84 ID:WFfeEk5g.net]
寝ぼけ過ぎてた
何やってんだ俺

static void sort(int[] a, int i, int j){
 if( j < i ){
  if (a[j] > a[j+1]) {
   int t = a[j];
   a[j] = a[j+1];
   a[j+1] = t;
  }
  sort(a,i,j+1);
 }
 else if( i > 0 ){
  sort(a,i-1, 0);
 }
}

型変えてgccで末尾再帰最適化確認した

279 名前:デフォルトの名無しさん mailto:sage [2015/08/15(土) 08:43:31.65 ID:aV490TlT.net]
再帰は可読性悪いとか言ってる人、数学的帰納法で落ちこぼれたのかな。

280 名前:デフォルトの名無しさん mailto:sage [2015/08/15(土) 09:51:49.02 ID:9roGQVeV.net]
>>276
再帰に向かない物まで再帰にするのが良くないだけだろ?



281 名前:デフォルトの名無しさん mailto:sage [2015/08/15(土) 11:26:39.03 ID:LE4LycT3.net]
末尾再帰にできるんならガンガン再帰使えばいいんでね
最適化してくれないjsみたいなのは除くとして

282 名前:デフォルトの名無しさん mailto:sage [2015/08/15(土) 12:06:13.60 ID:oUuKlgWM.net]
>278
その台詞はオプティマイザのご機嫌とって
オブジェダンプかけながらソースを書いていた事があって言ってるのか

283 名前:デフォルトの名無しさん mailto:sage [2015/08/15(土) 17:28:44.82 ID:7X/ZNWxV.net]
>>276
こういう必死さみても再帰の有害さがわかる

284 名前:デフォルトの名無しさん [2015/08/15(土) 17:33:32.28 ID:OJGJ2QAv.net]
>>279
すいません
関数型プログラミング言語でしか再帰書いた事ありません><

285 名前:デフォルトの名無しさん [2015/08/15(土) 23:44:57.75 ID:KDDvbpTi.net]
>>268
どや?

static void sort(int[] a) {
 for (int i = a.length - 1; i > 0; i--) {
  for (int j = 0; j < i; j++) {
   if (a[j] > a[j + 1]) {
    swap(a, j, j + 1);
   }
  }
 }
}

static void swap(int[] a, int i, int j) {
 int t = a[i];
 a[i] = a[j];
 a[j] = t;
}

286 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 02:27:58.97 ID:LltgmYR9.net]
void死すべし
副作用死すべし

287 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 02:31:35.69 ID:ysqlqGaE.net]
ループ原理主義者はオーダーの話を理解できない池沼

288 名前:デフォルトの名無しさん [2015/08/16(日) 03:05:47.99 ID:IVc263H9.net]
>>284
オーダーはデータ量が増えればこの項は無視できると
いうふうに項を消した残りかすなんだからデータ量が少ない
情況を仮定するとバブルソートがクイックソートより高速なのは常識。
オーダーを理解できてないアルツハイマーはお前の方。はいバブルソート論破。

289 名前:デフォルトの名無しさん [2015/08/16(日) 03:08:28.72 ID:IVc263H9.net]
結局さあ、再帰厨っていうのはオーダーの意味さえわかってない知恵遅れなんだよね。
「早すぎる最適化は諸悪の根源である」というプログラムの常識を理解してない池沼の根源。

290 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 03:21:51.10 ID:ysqlqGaE.net]
>>285
お、そうだな
www.ics.kagoshima-u.ac.jp/~fuchida/edu/algorithm/sort-algorithm/speed-compare.html



291 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 03:35:29.90 ID:ysqlqGaE.net]
ガチで理解していないようだから説明しておくと
バブルソート{約(1/2)*n(n+1)}は10個以下でquicksortのオーダーを下回る

292 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 07:52:21.53 ID:42LjL2Kj.net]
ソートの計算オーダーかよ
学校で習った知識を自慢したかったのか?
そーいや夏休みだったなあ

293 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 08:10:34.59 ID:ysqlqGaE.net]
こいつ無様すぎるw

294 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 11:35:18.70 ID:t2Jj+if9.net]
ループは読み難いですね。

295 名前:デフォルトの名無しさん [2015/08/16(日) 13:14:51.24 ID:6UxdI0kW.net]
>>291
絶望的に長くなって読み難くなるものがある。

全員に訊こう。
例えば、多重再帰じゃないと簡潔に書けないものは存在する。イエスかノーか。

296 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 13:28:24.19 ID:onk31F/8.net]
再帰では簡潔に書けないものもある。
再帰だとと簡潔に書けるものもある。

だからすべての場合で同じ方法を使わず
適切に使えというのは最初から言われていること。

その再帰万能って考え方はいつになったら治るのかね?

297 名前:デフォルトの名無しさん [2015/08/16(日) 13:32:21.21 ID:IVc263H9.net]
>>293
そういうことだな。

298 名前:デフォルトの名無しさん [2015/08/16(日) 13:38:08.54 ID:6UxdI0kW.net]
二人ともイエスな。ノーの意見の人はいないか?

299 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 13:41:10.33 ID:iyw7PDsu.net]
きっとノーって言ったら
ほら見ろ、再帰万能じゃねーか。
って言うつもりだろう?

面白そうだから俺がノーと
言ってやろうw
ノーだ。ノー。

300 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 13:45:55.82 ID:H2axMdYb.net]
言語特定しないでyes/noとか。
バカも休み休み言え。



301 名前:デフォルトの名無しさん [2015/08/16(日) 13:47:02.94 ID:6UxdI0kW.net]
>>296
俺は「ものもある」「ものは存在する」と訊いてるんだから、「ノー」なら完全否定派なだけだ。
別に面白い展開は無いぞ。

>>297
じゃあCにしよう。

302 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 13:49:00.82 ID:iyw7PDsu.net]
>>297
なんか、策でもあるんだろ。
誘導尋問だか、屁理屈や揚げ足だか、重箱の隅や失言狙いかしらんけど。
言葉尻を捕らえようとする戦略なんだろうから
生暖かく見てやろうぜ。

303 名前:デフォルトの名無しさん mailto:sage [2015 ]
[ここ壊れてます]

304 名前:/08/16(日) 13:51:11.93 ID:iyw7PDsu.net mailto: 俺は「ノー」と言った。完全否定派なだけだ。

その後の展開(レス)は無いのかよw
[]
[ここ壊れてます]

305 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 14:07:57.73 ID:t2Jj+if9.net]
再帰では簡単に書けないものもある、というところに、
どんなケース?
という疑問を抱くから、ノーかな。

306 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 14:16:38.84 ID:bhCkQFe7.net]
木の探索を書くとして、深さ優先なら再帰にするし幅優先ならループにする。
深さ優先でもスタックオーバーフローを考慮しなきゃいけない状況ならループで書く。

要は、状態を自分で管理して関数のパラメータとして引き回すくらいならループにする。

307 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 14:20:58.92 ID:H2axMdYb.net]
バカには再帰は理解できない
これが、このスレのこれまでの結論なので、

答えはノー
∵ 全ての再帰は簡潔でない

308 名前:デフォルトの名無しさん [2015/08/16(日) 14:28:14.30 ID:6UxdI0kW.net]
なるほどみんなありがとう。

309 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 15:06:07.80 ID:LltgmYR9.net]
トランポリン使えば末尾再帰にしなくても
スタックオーバーフローしないよ
ヒープ使いまくるけどね

310 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 17:45:23.08 ID:t2Jj+if9.net]
>>302 なるほど。



311 名前:デフォルトの名無しさん [2015/08/16(日) 20:22:40.46 ID:kniDeEJc.net]
>>302
>要は、状態を自分で管理して関数のパラメータとして引き回すくらいならループにする。

再帰使う人間はまさにこれがいやだから再帰使うんだが

そもそも、深さ優先か幅優先かで書き方変えるとかあり得ない
抽象化に失敗してるだけだ

312 名前:デフォルトの名無しさん [2015/08/16(日) 21:43:54.44 ID:IVc263H9.net]
>>307
幅優先探索をループで書いて、深さ優先探索を再帰で書くのはよくあるケースだと思うけどな
抽象化は関係ないw

313 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 22:39:02.64 ID:ysqlqGaE.net]
>>308
お前あれだけ恥ずかしい事書いておいてよくまた出てこれるなw

314 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 22:47:59.54 ID:bhCkQFe7.net]
ペチパーなのでPHPで書くけど、実際、深さ優先と幅優先の違いは大した問題じゃない。
単にスタックかキューかの違いなので、このコードなら $strategy を array_pop にすれば深さ優先で array_shift にすれば幅優先。
ループでも再帰でも、そこの戦略は簡単に抽象化できる。

<?php
class tree {
  public $value;
  public $children;
  function __construct($value, $children = []) {
    $this->value = $value;
    $this->children = $children;
  }
}

// [1, [2, [3, 4]], [5, [6, 7]]]
$sample = new tree(1, [new tree(2, [new tree(3), new tree(4)]), new tree(5, [new tree(6), new tree(7)])]);

function traverse($tree, $strategy) {
  $task = [$tree];
  while ($task) {
    $node = $strategy($task);
    echo $node->value;
    foreach ($node->children as $c) array_push($task, $c);
  }
}
traverse($sample, 'array_shift'); echo "\n"; // 幅優先
traverse($sample, 'array_pop'); echo "\n"; // 深さ優先。right to left になるのはご愛嬌。foreach の走査に array_reverse を入れれば left to right になる。

315 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 22:55:01.73 ID:bhCkQFe7.net]
今のコードで $task が >>302 でいう「状態」になるわけだけど、
まず深さ優先なら再帰で書くってのは、次の depth_first_rec のように書けば $task をコードから消せる。状態管理なんてのは本質じゃないので消せるならそう書く。

function depth_first_rec($node) {
  echo $node->value;
  foreach ($node->children as $c) depth_first_rec($c);
}
depth_first_rec($sample); echo "\n";

一方、幅優先を再帰で書こうとしたら、$task を再帰のパラメータに乗せなきゃならない。
関数のシグネチャはアルゴリズムの本質を表明すべきだと思うので、$task みたいなものを出したくない。これならループで書く。
もちろん関数型言語で書く人は、綺麗な関数でラップして traverse_rec みたいなのは内部に隠蔽するだろうけど、
見比べてみればそれって、>>310 の traverse が「綺麗な」外側の関数で traverse_rec が while ループに対応する。全く同じことやってる。

function traverse_rec($strategy, $task) {
  if ($task) {
    $node = $strategy($task);
    echo $node->value;
    foreach ($node->children as $c) array_push($task, $c);
    traverse_rec($strategy, $task);
  }
}
traverse_rec('array_shift', [$sample]); echo "\n";
traverse_rec('array_pop', [$sample]); echo "\n";

316 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 22:57:42.02 ID:bhCkQFe7.net]
とまあ、この程度のことは >>307 本人には釈迦に説法だろうけど、ROM ってる誰かの役に立てばと思って一応書いてみた。
おやすみ。

317 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 23:04:29.84 ID:qX4pihue.net]
>>311
> 一方、幅優先を再帰で書こうとしたら、$task を再帰のパラメータに乗せなきゃならない。

載せる必要はない。

普通は関数内関数(クロージャー含む)を使って
再帰関数の外の変数を使うもの

C言語ではやりにくいが、グローバル変数を使えば可能

こんな常識も知らないのか?

318 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 23:10:17.19 ID:bhCkQFe7.net]
>>313
コメントありがとう。
今回の問題でそういう実装にすると $task に破壊的代入を行うことになると思うけど、
それを気にしないなら別によいと思う。

319 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 23:23:41.26 ID:ysqlqGaE.net]
>>310-312
とてもわかりやすいコード乙

>>313
最適化

320 名前:ニステートレス化のためにパラメタで渡すのは常識だろ
荒らすな
[]
[ここ壊れてます]



321 名前:デフォルトの名無しさん [2015/08/16(日) 23:24:18.75 ID:5vUfdwLX.net]
木の探索はスタック一本で実現できるので、再帰は使わないほうが良い。
再帰使うと攻撃に弱くなる。

322 名前:デフォルトの名無しさん [2015/08/16(日) 23:30:59.94 ID:5vUfdwLX.net]
木自体もリンクリストを使って直列化したデータ構造で表現しておくと、
操作がやりやすくなる。

直列された状態では通常、前から後ろに移動していくと、深さ優先探索の状態になる。
デメリットは、キャッシュに乗りにくくなることと、使用メモリー量が
大きくなること。

ただし、操作のコストが一般に低くなるので、十分ペイする。
そして攻撃に強い。

323 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 23:32:55.62 ID:qX4pihue.net]
>>315
> 最適化とステートレス化のためにパラメタで渡すのは常識だろ

お前、最適化と言ったら、スピード上げることしか思いつかないのか?

「可読性の最適化」だよ。
可読性がいい方向にコードを最適化することで
メンテナンス性を上げることができる。

お前は単なるスピード狂。
お前が書くコードは読みづらい

324 名前:デフォルトの名無しさん [2015/08/16(日) 23:44:57.83 ID:5vUfdwLX.net]
データ構造とアルゴリズムの分離を考えても再帰は不利。

325 名前:デフォルトの名無しさん [2015/08/16(日) 23:47:34.77 ID:5vUfdwLX.net]
>>313
グローバル変数は、再利用性を著しく損なうので避けるべき。

326 名前:デフォルトの名無しさん mailto:sage [2015/08/16(日) 23:55:06.97 ID:ysqlqGaE.net]
>>318
スタック消費抑えるために最適化するのは常識なんだが
どこの世界の似非プログラマ?

327 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 00:08:45.56 ID:kjPlSxav.net]
つかクイックソートって
今のアーキテクチャにはあわんでしょ

328 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 00:28:50.83 ID:ZK4qdIAD.net]
とりあえず否定するスタイル

329 名前:デフォルトの名無しさん [2015/08/17(月) 00:36:22.18 ID:I1eaKx/I.net]
>>309
バブルソートで論破されて必死やなw

>>310
衒学的なオナニーされておられるところ大変恐縮ですが、結局ループでいいってことだろ。
抽象化言いたいだけやろ。しょうもな。

330 名前:デフォルトの名無しさん [2015/08/17(月) 00:40:53.56 ID:I1eaKx/I.net]
結局さあ、再帰に大きな瑕疵があるってことわかったんだから、
再帰厨は潔く観念して俺に敬服するべきだと思うんだよね。



331 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 01:17:00.24 ID:3kIm88tb.net]
再帰はバカには理解し難いと言う欠点がある。

332 名前:デフォルトの名無しさん [2015/08/17(月) 01:44:30.24 ID:y5LPXYrp.net]
>>326
ほんこれ。

333 名前:デフォルトの名無しさん [2015/08/17(月) 02:05:13.63 ID:PZrD2gdn.net]
トリッキーな構造だから一見わかりづらいよな。
再帰を使わないと解決できない問題があるとすれば、再帰を使えない事がその人の限界になる。

334 名前: ◆QZaw55cn4c mailto:sage [2015/08/17(月) 05:40:35.05 ID:TRZJFBPo.net]
>>322
今でも普通クイックソートだね.
次数が減ったら挿入ソートや選択ソートに切り替えはするが

335 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 08:18:37.09 ID:bgkOWECj.net]
クイックソートはループで実装
これ常識


ループの可読性が悪いなんて言ってるのはレベル低すぎ

336 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 09:50:03.46 ID:fqo2f2L7.net]
>>330
while()って読み難くありませんか?

337 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 10:03:44.62 ID:HKx5lNza.net]
>>331
質問じゃなくて、コードを書いて、
このコードとこのコードを比較して
while()は読みづらいって言いなさい。
他人の失言を狙ってるのバレバレだから。

338 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 10:29:19.62 ID:i5qYhPSf.net]
お前、バカだろう。
繰り返しで書いたクイックソートは再帰で書いたそれに比べて可読性が低いのだ。

339 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 10:50:30.82 ID:HKx5lNza.net]
それはクイックソートだけの話だからな。

340 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 10:52:50.02 ID:PCwhqe1a.net]
結局は、構造を概念どおりに忠実に実装すれば再帰になるし、
頭の中で最適化すればループになるし、という話だよね。
どっちでもいい人にとってはこれほど無駄な議論はない。
結局どちらかしか使えない無能たちの罵り合いでしかない。



341 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 10:56:29.07 ID:HKx5lNza.net]
>>335
いや、そうじゃないんだよ。

某関数型言語では、その言語の制約上
再帰で書くしかないんだよ。

だけど、自分が使ってる言語は優れていると
思いたいものだから、再帰しか使えない制約ではなく
再帰のほうが優れてるかということにしたいんだよ。

どちらかしか使えない人なんていない。
関数型言語が使えないだけ。

342 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 11:02:29.07 ID:PZrD2gdn.net]
Cで探索・ソートについて言えば、速度面で有利なのはループ。
関数コールが少ない分、ループの方が圧倒的に速い。
速度を追求するならループになる。

343 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 12:05:32.92 ID:fqo2f2L7.net]
>>332 単純に for( ; ; ){} に較べて読みにくくないかと。

for( ;<<ループの終了条件>>; ){ p() } は
for( ;<<ループの終了条件>>; p()){} の内、必要な情報だけ第三引数に抽出することができるが、

while(<<ループの終了条件>>) { p() } だと
どんな情報に着目するべきかは終了条件以外のヒントがない。
それでwhile()は難しいかと。

344 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 12:18:46.07 ID:HKx5lNza.net]
>>338
なんの情報が必要なんだよ?
終了条件さえあれば十分だろ?
ジェネレータとか、そういうもんだぞ。

345 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 13:15:13.35 ID:i5qYhPSf.net]
>>336
お前、バカだろう。
繰り返しで書いたクイックソートは再帰で書いたそれに比べて可読性が低いのだ。
仕様上、繰り返しを記述出来ない言語は比較の対象外だ。

346 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 13:43:37.43 ID:bgkOWECj.net]
可読性の高い低いなど下らない話。
読めるコードであれば何の問題もない。


実際にプログラマは比較関数を自作して
クイックソートのライブラリに当てはめるだけなんだし。


実用性を備えるループ方式と、
使用厳禁の再帰方式とじゃあ比較にならない。

347 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 13:51:20.52 ID:i5qYhPSf.net]
じゃ、これは撤回だね。
> ループの可読性が悪いなんて言ってるのはレベル低すぎ

348 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 13:57:08.88 ID:bgkOWECj.net]
読めるコードであれば何の問題もない。
クイックソートのコードは十分に読めるコード

ループの可読性が悪いなんて言ってるのはレベル低すぎ

349 名前:デフォルトの名無しさん [2015/08/17(月) 14:08:09.19 ID:J0NniHMW.net]
もう何で争ってるのか不明なんだけど

350 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 14:09:55.63 ID:bgkOWECj.net]
争いなんてないさ



351 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 14:18:37.75 ID:HKx5lNza.net]
読めるコードであれば何の問題もない。
ただ可読性は高い方がいい。

ただそれだけのことだろう?

352 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 14:53:55.09 ID:i5qYhPSf.net]
>>343
(可読性悪くても)読めるコードなら問題ない。と言いつつ。
同レス内で、ループの可読性の低さを否定してる。
お前、バカだろう。

353 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 18:09:10.76 ID:5EpnwL1P.net]
この馬鹿はバカが口癖なのか?

354 名前: ◆QZaw55cn4c mailto:sage [2015/08/17(月) 20:01:13.21 ID:TRZJFBPo.net]
>>330
書いてみろよ

355 名前: ◆QZaw55cn4c mailto:sage [2015/08/17(月) 20:12:36.56 ID:TRZJFBPo.net]
>>340
というより,クイックソートはループでは書けない
ヒープにスタック構造を持ち込んでおきながら「ループで書きましたぁ」とか‥

356 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 20:16:45.10 ID:rLKFJTDK.net]
>>350
再帰処理のクイックソート vs 非再帰処理のクイックソート
www.drk7.jp/MT/archives/000995.html

再帰を使わないでクイックソートは実装できるね。
しかもそっちのほうが速い

357 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 20:18:08.13 ID:rlqXRw2u.net]
暇をもてあました学生が再帰で俺TUEEEEEEする遊び

358 名前:デフォルトの名無しさん [2015/08/17(月) 20:40:03.62 ID:RDuEyBYc.net]
再帰でCPS変換とかサクサク使えないレベルならループ書いときゃいいんじゃね
可読性に関する再帰のコストはほぼ周りがCS卒かどうかで決まる
CS勉強してりゃ再帰の方が圧倒的に読みやすいし加工しやすいし最適化しやすい
してなきゃループがわかりやすい。そんだけ。

359 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 20:52:33.62 ID:bgkOWECj.net]
ループの可読性にしつこく文句言うやついるかと思っていたら、
これまで話を完全に無視して、
ループでは書けないなどと言い出すものまで現れるのかよ・・・

360 名前: ◆QZaw55cn4c mailto:sage [2015/08/17(月) 21:08:42.74 ID:TRZJFBPo.net]
>>351
それ,結局データ構造にスタックを持ち込んでいるね‥
非再帰とはいいにくい,普通に再帰で書いたほうがいいんじゃないかな‥



361 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 21:27:59.23 ID:rlqXRw2u.net]
思い出しやすい方で書くかなあ。CPS変換が読みやすいって言ってるように見える人がいるけど
サンクがどれだけ詰まれてくか目に見えないじゃない
ああ、Lispならわかるんだっけ

362 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 21:34:14.06 ID:5i910ycA.net]
>>355
再帰による実装は、コードが簡潔になる利点はあるものの、
スタックが足りなくなる恐れがあります。
ソート作業は、大量のデータに対して行うことも多いので、
この問題は致命的です。

この問題は、自力でスタックを制御できるようにして、
再帰構造を取りやめれば解決できます。
スタックサイズは log2 n 以上の容量があれば足りることが実証されています。
int型が 64ビットだとしても、たかだか 128要素で済むので、定数で構わない
ttp://u222u.info/nh3Q

363 名前:デフォルトの名無しさん mailto:sage [2015/08/17(月) 23:29:17.65 ID:i5qYhPSf.net]
>>351
お前、バカだろう。
perlは関数呼び出しのオーバーヘッドがでかいのであたりまえ。
java版 繰り返し:平均 408.86 ms, 再帰:平均 236.81 ms
stackoverflow.com/questions/12553238/quicksort-iterative-or-recursive
The average of the iterative solution was 408.86 ms while of recursive was 236.81 ms
However -these are constant number of ops, while not changing the number of "iterations".

アンチ再帰の根拠がまた一つ否定された。

364 名前:デフォルトの名無しさん mailto:sage [2015/08/18(火) 00:54:03.83 ID:iaUEwJyI.net]
単位がオーダーだけの文献は読まんでいい
さすがに古すぎる

単位にサイクル使ってるやつだけ参考にしろ

365 名前:デフォルトの名無しさん mailto:sage [2015/08/18(火) 04:11:08.35 ID:6SfpmUjr.net]
>>357
log2 nに限定するならメディアン必須になるし、
投機的実行や並列化の恩恵にも預かれないぞ
それこそ「現在のアーキテクチャに合わない」

>>359
サイクルって何?

366 名前:デフォルトの名無しさん mailto:sage [2015/08/18(火) 08:16:42.70 ID:FMltliIe.net]
>>360
log N 「以上」なのでメディアン(割りきれるか割りきれないかだよね?)は融通効くし、
パイプラインは関係ないと思うんだけど具体的にどう、最適化に悪影響なの?

367 名前:デフォルトの名無しさん mailto:sage [2015/08/18(火) 09:23:27.84 ID:6SfpmUjr.net]
>>361
並列は言わずもがな、分岐が増えるほど投機実行も不利

>log N 「以上」なのでメディアン(割りきれるか割りきれないかだよね?)は融通効くし
だから全要素からのメディアン取るのが必須になるだろと
さもなくば埋まったら切るとかの戦略でもない限り、大きさ固定のスタックは無理

368 名前:デフォルトの名無しさん mailto:sage [2015/08/18(火) 09:32:58.52 ID:6SfpmUjr.net]
>>361
ごめん、リンク先見てなかった
小さい方だけ計算していくなら、再帰でもループでも可能だね

369 名前:デフォルトの名無しさん mailto:sage [2015/08/18(火) 09:55:04.16 ID:biaMMpq3.net]
再帰法の方が簡潔な記述となり実装が簡単となったとしても、
処理速度やメモリ消費の点で効率が悪い。

これが真実。

効率の求められるクイックソートはループ方式ですね。

370 名前:デフォルトの名無しさん mailto:sage [2015/08/18(火) 10:02:42.34 ID:FMltliIe.net]
>>363
実は自分もメディアンのこと、ピボットのことだと気づかなかったから変なこと言ってました……
なんかlog Nとスタックのワードだけで勝手に勘違いしてた。
恥ずかしいからROMります……



371 名前:デフォルトの名無しさん [2015/08/19(水) 06:32:50.20 ID:h1yQg/qV.net]
サイクルって結局何だったんだ
オーダーと比較するんだからCPUサイクルのわけないだろうし

372 名前:デフォルトの名無しさん [2015/08/19(水) 06:48:19.79 ID:8XFwGYsL.net]
再帰はセキュリティの問題から使ってはいけない。

これは既に常識。

373 名前:デフォルトの名無しさん mailto:sage [2015/08/19(水) 06:53:40.18 ID:3Ipmhs8Y.net]
>>367
ワトソンでは基幹部分で使われている。大変だ。

374 名前:デフォルトの名無しさん [2015/08/19(水) 06:59:26.41 ID:8XFwGYsL.net]
じゃあワトソンは使うな。

375 名前:デフォルトの名無しさん [2015/08/19(水) 08:04:33.92 ID:8XFwGYsL.net]
末尾再帰はループに展開されるから大丈夫 → 結局再帰が良くないからループにするんだよね?

◯◯では使われてる → じゃあ◯◯は使うな、使われてないのに適当なこと言ってたら訴えられますよ?

再帰下降法も使うなというのか? → 再帰下降法は使うな、入力の解析を再帰で行うのは最も危険。

376 名前:デフォルトの名無しさん mailto:sage [2015/08/19(水) 08:08:05.43 ID:3Ipmhs8Y.net]
>>370
ワトソンの基幹部分にPrologが使われているというのは常識だが。

377 名前:デフォルトの名無しさん mailto:sage [2015/08/19(水) 08:18:36.42 ID:cBcKF4Ir.net]
>再帰はセキュリティの問題から使ってはいけない。

だから一般化しすぎだろ
scalaとかでも同じ事言うの?

378 名前:デフォルトの名無しさん [2015/08/19(水) 08:20:15.23 ID:8XFwGYsL.net]
再帰の危険性はCERT CC読むだけでもわかること。
いまさら再帰を使うべきというのはおかしい。

しかも、何故かWEB系の人に多いのがおかしすぎる。
WEBは最も再帰を避けるべきであろう。

379 名前:デフォルトの名無しさん [2015/08/19(水) 08:25:28.68 ID:8XFwGYsL.net]
>>372
言語が再帰を別のアルゴリズムに変更することを保証しているなら、
使っても良いだろう。
しかし保証しないのであれば、使うべきではない。

例えば、一般的なケースでは大丈夫 → これは使うな、攻撃者は一般的なケースで攻撃してこない。
再帰下降法について擁護するものは、大体一般的な例を述べるが、攻撃者は
最悪のケースで攻撃してくる。

380 名前:デフォルトの名無しさん [2015/08/19(水) 08:27:48.29 ID:8XFwGYsL.net]
保障されるのか保障されないのか判別できないなら使うべきでない。

大抵のコンパイラがループに展開する → これは使うべきではない、言語が保証しない限り
使ってはいけない。



381 名前:デフォルトの名無しさん mailto:sage [2015/08/19(水) 08:32:59.75 ID:cBcKF4Ir.net]
>>374
いやだから末尾再帰は確かにループに展開されるけど
普通の再帰は展開されない(余再帰とかいうあれ)
val one:Stream[Int] = 1#::one

382 名前:デフォルトの名無しさん [2015/08/19(水) 08:38:24.50 ID:8XFwGYsL.net]
>>376
じゃあ使うなよ。

再帰がヒープに展開されるなら、現状では使っても良いとするしかないだろう。
現在のコンピュータにはその程度の安全性しかない。

一方、マシンスタックが消費されるなら、これは使ってはいけない。

言語が保証できるかどうかはこういう話。

逆に言うと、保証できる言語は本質的に遅いから変えたほうが良いよ?

383 名前:デフォルトの名無しさん mailto:sage [2015/08/19(水) 08:40:13.17 ID:cBcKF4Ir.net]
そもそもVM上で動く言語でセキュリティの観点から再帰使うな
って言われてもな
一般化しすぎ

384 名前:デフォルトの名無しさん mailto:sage [2015/08/19(水) 08:43:41.41 ID:cBcKF4Ir.net]
>>377
遅延データ構造で余再帰使うなってあんた

385 名前:デフォルトの名無しさん mailto:sage [2015/08/19(水) 08:47:34.95 ID:cBcKF4Ir.net]
入力をその場で評価せずに遅延データ構造であらわすってあるけど
そこで末尾再帰なんかしたらそれこそ危ない

386 名前:デフォルトの名無しさん [2015/08/19(水) 08:58:49.14 ID:8XFwGYsL.net]
>>380
遅延評価によってマシンスタック消費の抑制を保証できるのであれば、
使っても良いだろう。

しかし、保証するという事はどういうことが起きるのか、良く考えたほうが良い。

大抵のケースで保障できる → これは使ってはいけない、条件が付いた時点で保障できていない。

387 名前:デフォルトの名無しさん [2015/08/19(水) 09:01:52.31 ID:8XFwGYsL.net]
再帰は本質的に危険なので、教科書的にもループを基本にするべきではないだろうか。

逆に言うと、再帰で説明する教科書は、既に古いので使うべきでない。

20世紀の教科書。

388 名前:デフォルトの名無しさん [2015/08/19(水) 09:04:29.34 ID:8XFwGYsL.net]
こういった議論でわかることは、最近の素晴らしい言語は、問題点の
議論を避けている。

結論が出るまで使わないほうが良い。

389 名前:デフォルトの名無しさん mailto:sage [2015/08/19(水) 09:36:58.20 ID:3Ipmhs8Y.net]
>>382 再入可能なコードは本質的に危険ということですか?

390 名前:デフォルトの名無しさん mailto:sage [2015/08/19(水) 10:38:04.52 ID:qmnFr7bU.net]
再帰云々の議論をしている最中に関数型言語を持ち出してくる奴はキチガイ。

関数型言語なんて再帰キチガイが再帰を正当化するために作り出した言語で
あって、逆に言えば関数型言語でない限り再帰に正当性は一切ない。
再帰キチガイは再帰に問題がありまくることを知っているからこそ、再帰を
満喫するために関数型言語なんていう



391 名前:キチガイ非効率言語を作ったんだから、
そこに収容されていて、一般論のスレに出てくるな。
[]
[ここ壊れてます]

392 名前:デフォルトの名無しさん [2015/08/19(水) 10:55:26.78 ID:N4waeMow.net]
うわあ手続きキチガイだ

393 名前:デフォルトの名無しさん [2015/08/19(水) 11:13:42.96 ID:h1yQg/qV.net]
要するに反論できないから関数型言語を議論から除きたいと

394 名前:デフォルトの名無しさん [2015/08/19(水) 11:17:04.81 ID:irPHrK71.net]
>>385
そうですね。

>>384
最近のライブラリが歳入可能性に言及するのは、スレッド安全に関連する話です。

関係ない話題をうまく混ぜ込むのが最近のトレンドですが、ム板でやると
馬鹿だと思われますよ。

395 名前:デフォルトの名無しさん [2015/08/19(水) 11:19:08.64 ID:irPHrK71.net]
>>387
関数型言語は言語が再帰を避けてくれるから安全だと言いたいんですよね?

言語が避けてくれるのは、再帰が危険だからですよね?

396 名前:デフォルトの名無しさん [2015/08/19(水) 11:22:24.20 ID:irPHrK71.net]
関数型言語自体が、まだ結論の出ていないものだと思います。

威勢の良い宣伝は良くあります。

それはどの言語でも経験したことです。

例えばJavaはC/C++のおよそ20倍高速だった時代もあったのです。

現在は、関数型言語がC/C++のおよそ100倍高速なのです。

従っていずれ1/100になるでしょう。

397 名前:デフォルトの名無しさん [2015/08/19(水) 11:28:11.15 ID:irPHrK71.net]
C++は良く利用される以前、Cの二倍遅く、Cの二倍のメモリーを使うと言われていました。

これがC++が使われるようになった理由の一つです。

Objective-Cは逆に、Cの二倍速く、Cの二倍省メモリーだったのです。
従ってその時点でObjective-Cは負けていました。

過剰な宣伝が通用するのは、誰も使っていなかったからなのです。

関数型言語がC/C++の100倍まで高速化したのは、本当の本当に誰も使っていないからでしょう。

398 名前:デフォルトの名無しさん mailto:sage [2015/08/19(水) 12:45:01.27 ID:yS+hRb+C.net]
>>385
うまいことを言う!

これコピーして保存しとくぜ。

399 名前:デフォルトの名無しさん [2015/08/19(水) 23:06:26.12 ID:EEfFXLQD.net]
威勢の良い宣伝も糞も実際に使われてるだろ

400 名前:デフォルトの名無しさん mailto:sage [2015/08/20(木) 06:59:05.01 ID:cFwOLAtj.net]
スカトロを基準にして
うんこは食べ物ですって言うようなもん



401 名前:デフォルトの名無しさん mailto:sage [2015/08/20(木) 10:35:31.02 ID:PsQjKp/h.net]
jbbs.shitaraba.net/netgame/14889/
ここに「おはむぅ('ω'`)」って書きこんで

402 名前:デフォルトの名無しさん [2015/08/20(木) 12:12:44.84 ID:5WCLlVT0.net]
>>394は発達障害

403 名前:デフォルトの名無しさん [2015/08/20(木) 17:13:17.66 ID:5F2FSsFe.net]
仕事でscalaとかscalaZとか使っとるから再帰や関数型が非実用的って言われると??ってなる

404 名前:デフォルトの名無しさん [2015/08/20(木) 17:14:14.66 ID:5F2FSsFe.net]
あと別にそんなに高速性強調されるか?

405 名前:デフォルトの名無しさん mailto:sage [2015/08/20(木) 17:42:02.04 ID:vSASgIXr.net]
オレ、 「再帰関数が好き」って言ったら、 笑う?

406 名前:デフォルトの名無しさん mailto:sage [2015/08/20(木) 17:42:58.19 ID:2qNm8QiI.net]
>>397-398
関数型でも単純再帰はgotoみたいなプリミティブな構造だから
構造プログラミングにおけるwhileやforに相当するrecursion schemes使えって言われてるじゃん
(例:catamorphismはfoldに相当するなど)
recursion schemes含めて再帰が有用というなら妥当するけど、どういう論旨で再帰が有用とおっしゃる?

407 名前:デフォルトの名無しさん [2015/08/20(木) 20:45:39.40 ID:5WCLlVT0.net]
無理にfold使って書くより単純な再帰使うほうがわかりやすいなんて幾らでもある
foldやmap使えってのを素人向けに強調するのは構わんが、行き過ぎるのも愚劣

408 名前:デフォルトの名無しさん mailto:sage [2015/08/20(木) 21:03:03.09 ID:2qNm8QiI.net]
残念ながらfoldやmapが使えるなら常に再帰よりそちらを使ったほうがよいと言い切れる
なぜなら再帰で書いた関数は変更に弱いから
おもちゃみたいなコードしか書かないなら別だがね

409 名前:デフォルトの名無しさん [2015/08/20(木) 22:00:29.18 ID:5WCLlVT0.net]
>>402
>なぜなら再帰で書いた関数は変更に弱いから
>おもちゃみたいなコードしか書かないなら別だがね

はあ?

410 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 00:21:00.76 ID:IS5nxfT5.net]
一生ひとりでサンプルプログラム書いてろ
迷惑だから社会に出てくんなよ



411 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 00:25:28.79 ID:D+2gPP3C.net]
>>400
基本的には再帰よりも高階関数というか型クラスに定義してある汎用的な関数を使ったほうがいい
同じ事ができるならより弱い力のものを使ったほうがいいし(monadよりapplicative,applicativeよりfunctor)

が型クラスのインスタンス作る時に再帰で実装する時はあるよ

412 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 00:31:28.66 ID:D+2gPP3C.net]
まぁところによりけりでscalaの標準ライブラリのコンテナのコードなんて
while、再代入、ダウンキャストしまくりでとても関数型プログラミングとは言えない

利用者にとってはライブラリが関数型プログラミングで実装してあるかどうかよりも
それを使って関数型プログラミングできる方が重要なんだからいいけど

413 名前:デフォルトの名無しさん [2015/08/21(金) 03:02:31.30 ID:wrsjniww.net]
日常業務で使ってるが、無理にfoldrで書いたりせずに
普通の再帰で書くことは少なくないしお互いに読みやすい
fold厨とポイントフリー厨は同じ箱

414 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 09:15:46.95 ID:TIO5PnJE.net]
>>397
何のお仕事?

415 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 12:24:12.68 ID:+b9Sq2lj.net]
簡単なアルゴリズムも書けないくせに何でもほいほい言語学習に飛びついて尖った知識が身につかない奴を見ると腹が建つ
haskellで探索アルゴリズムも書けない奴はhaskellをいじるのはまだ早い

416 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 16:54:57.68 ID:0U24jQiQ.net]
>>409 すれ違い。消えてよし。

417 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 17:05:56.55 ID:cNm3l2b6.net]
探索アルゴリズムなら高校のころ、
インターネットが普及してない時代に
C言語で実装したことがあるからなぁ。
わざわざ言語変えて実装するまでもないかな。

418 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 19:59:06.06 ID:sO1LNJ7K.net]
言語、ツール、OS、デザインパターンみたいな道具や手法に拘るやつで
凄いと思えるやつに会ったことがない

ただの手段で目的じゃねーからな
目的を達成するために適したものを選んで使うのが道具

419 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 20:11:40.29 ID:D0T0zJ3M.net]
>>412 C/C++でループだけに徹して書く人は凄いと思うけど。
普通だったらもっと高級言語使って、再帰も拘らず自由に使って
楽しようとするでしょう。

420 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 20:23:54.14 ID:DXj+sr9D.net]
再帰を嫌う人って、抽象化が苦手なんだろうね
フィボナッチ数列を例にとると、初項から順番にループを使って計算させることは簡単だけど、
そこから f(n) = f(n-1) + f(n-2) という数式に落とすのが苦手という感じ



421 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 20:25:32.36 ID:106+9rwN.net]
でも一般項で直接計算した方が速くね?

422 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 20:29:42.52 ID:DXj+sr9D.net]
>>415
直接計算した方が速いよ
でも抽象化はバグを作り込みにくくすることを目的にしてるからね
目的が違うとしか言いようがない

ガベージコレクタだってそうさ
プログラマにメモリ管理をやらせないようにしてバグの源を減らしているんだが、
ガベージコレクタが走ってる間は固まってしまうというデメリットがある

423 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 20:37:23.27 ID:106+9rwN.net]
そこで関数型プログラミングですね判ります

424 名前:デフォルトの名無しさん [2015/08/21(金) 21:25:21.72 ID:w5MKuYb1.net]
C/C++の時代はもう終わったんだよ。
GUIならJavascriptの時代だし、サーバーサイドならHaskell一択。
まあそんな時代。

そういうわけで、ウェブブラウザをHaskellで、ウェブサーバを

425 名前:Javascriptで
書いてみよう。
プロの皆、頼んだよ。
[]
[ここ壊れてます]

426 名前:デフォルトの名無しさん [2015/08/21(金) 22:11:12.63 ID:uW+oAt+B.net]
ブラウザをrust
サーバーをscalaで書こう

427 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 22:17:46.51 ID:gulw8KQa.net]
C/C++否定するならGHCのruntimeをhaskellで書きなおしてからにしろ。

428 名前:デフォルトの名無しさん [2015/08/21(金) 22:22:10.87 ID:MAihWaWV.net]
>>420
ブラウザをHaskellで書こう。

429 名前:デフォルトの名無しさん [2015/08/21(金) 22:29:51.21 ID:XU9Q1w5t.net]
>>358
バカはお前だハゲ。
再帰のプログラム見てみろよ。

while (l < h) {
 if (arr[l] < piv) {
  l++;
 } else if (arr[h] >= piv) {
  h--;
 } else {
  swap(arr,l,h);
 }
}

思いっきりループ使ってんじゃねえかwwww

430 名前:デフォルトの名無しさん [2015/08/21(金) 22:31:45.44 ID:XU9Q1w5t.net]
>>355
スタックを使って何が悪い。
ループとスタックこれがハードボイルド。
再帰はただのチンカス。



431 名前:デフォルトの名無しさん [2015/08/21(金) 23:18:43.29 ID:kMLZ+IBA.net]
スタック使ったらスタックオーバーフローするじゃないか!!!
スタック使っといて再帰ダメとはなんだ!!!

とか思ったんじゃないの。

432 名前:デフォルトの名無しさん mailto:sage [2015/08/21(金) 23:36:53.53 ID:D+2gPP3C.net]
>>408
アドテク

433 名前:デフォルトの名無しさん mailto:sage [2015/08/22(土) 00:38:22.30 ID:xKKBKjQe.net]
スタックオーバーフローするってよりも
リソースの上限見積もりをしない事が問題なんだよな
再帰使ってもリミッタかけて上限界保障すれば別にいいけど
上限下限当ててくと見積もりにくさやパフォーマンスの超劣化が表面化してくるんだよなぁ

434 名前:デフォルトの名無しさん mailto:sage [2015/08/22(土) 01:32:21.16 ID:B3Y3H6bu.net]
>>412
> 言語、ツール、OS、デザインパターンみたいな道具や手法に拘るやつで
> 凄いと思えるやつに会ったことがない

単にお前が凄いやつにあったこと無いだけだろw

お前の言う凄いやつが誰か知らないから、
有名人でいいや。

凄いやつで、言語、ツール、OS、デザインパターンに
拘らないと言ってる奴いるか?

435 名前:デフォルトの名無しさん [2015/08/22(土) 08:06:55.74 ID:qggPju08.net]
それはバトルプログラマー山田のことだな。

436 名前:デフォルトの名無しさん [2015/08/22(土) 08:46:01.92 ID:4IPZDgMf.net]
>>427
>>412は会った事がない。と言ってるだけで、存在しないとは言ってない。
言いがかりつけないように。

437 名前:デフォルトの名無しさん mailto:sage [2015/08/22(土) 09:04:25.73 ID:xKKBKjQe.net]
開発に何を使うかより

製品の性能重視したほうがいいよ
バグ発生率、実行性能、メモリサイズ、消費電力、メンテナンスコスト
こーいうの数値化して客観的に比較して現実と向き合ったほうがいいよ

438 名前:デフォルトの名無しさん mailto:sage [2015/08/22(土) 09:42:53.71 ID:P/XTDL5m.net]
すごい人ほどこだわるんだよな
ただ、すごい人はこだわりを外れたとこでもやっぱりすごいんだけど

439 名前:デフォルトの名無しさん mailto:sage [2015/08/22(土) 11:28:59.69 ID:B3Y3H6bu.net]
>>429
だから、あったことがないだけだろ。って
書いてあるだろ。

例えば、俺だってシューズに拘るやつで
凄いと思えるマラソンランナーに会ったことがない。

440 名前:デフォルトの名無しさん mailto:sage [2015/08/22(土) 11:31:34.10 ID:B3Y3H6bu.net]
>>430
> バグ発生率、実行性能、メモリサイズ、消費電力、メンテナンスコスト
> こーいうの数値化して客観的に比較して現実と向き合ったほうがいいよ

そんなことはわかってる。

どうやってそれを数値化し、どうやってそれを解決するか。
それを口に出して言うことが重要だ。

で、君は、どうやればいいと思う?
「根性で頑張る」は手法ではないよ。



441 名前:デフォルトの名無しさん mailto:sage [2015/08/22(土) 15:57:53.79 ID:gOdxnhpv.net]
再帰について話し合えよ。
クソどもが

442 名前:デフォルトの名無しさん [2015/08/22(土) 15:58:17.75 ID:Nzlin5Sx.net]
再起不能

443 名前:デフォルトの名無しさん mailto:sage [2015/08/22(土) 16:17:27.41 ID:4AYLR5mV.net]
こだわりも何も再帰を使っていけないのは世界のルール!
鉄則!プログラミングの初歩の初歩!


再帰を気にせずに使ってしまうのは
ただの趣味プログラマ。

444 名前:デフォルトの名無しさん mailto:sage [2015/08/22(土) 19:12:47.71 ID:KyZWN2Ug.net]
どういう話になってんのか知らんけど
ツリーコントロールにバインドするデータは再起で扱うしかないだろ

445 名前:デフォルトの名無しさん [2015/08/22(土) 19:57:12.11 ID:4IPZDgMf.net]
数学的帰納法で落ちこぼれたガイジが暴れてるだけ。

446 名前:デフォルトの名無しさん mailto:sage [2015/08/22(土) 22:48:47.92 ID:8n3Hy4+Y.net]
数学ぽいと思って使っちゃうのね

447 名前:デフォルトの名無しさん [2015/08/22(土) 22:51:07.69 ID:XZXv5ALV.net]
マトモに大学で数学教育受けたことあると再帰に抵抗がなくなるのは事実

448 名前:デフォルトの名無しさん [2015/08/22(土) 23:39:22.15 ID:Nzlin5Sx.net]
深さ方向の見積もりが常に出来るなら再帰は便利
見積れないなら危険だから使わないか例外吐くようにするべき

ループと等価だからループで置き換えろっていう人もいるが
ループにしたからと言って危険が0になる訳ではなく
どのみち例外を吐く必要がある

449 名前:デフォルトの名無しさん [2015/08/22(土) 23:45:35.99 ID:XZXv5ALV.net]
それは再帰の問題じゃなくて例外処理の問題

450 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 00:46:58.86 ID:cJWS/2ha.net]
再起で扱うしかないなんて発想が出ること自体
数学的論理的思考を欠いている。


情報処理のまともな思考力があれば
ループにし、かつ危険を0にしたコードを作成すべき。



451 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 01:57:15.79 ID:vCSJ96fF.net]
再帰に親でも殺されたのかこいつは

452 名前:デフォルトの名無しさん [2015/08/23(日) 01:59:37.69 ID:myL1fwDZ.net]
計算の本質が再帰にあることを知らない子はねえ…

453 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 03:53:30.61 ID:dUB2+H1B.net]
抽象化ができない子なんだろ

454 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 08:40:52.24 ID:F/ISrncw.net]
関数呼び出しコンパイルして出てくるのはジャンプなんだから
手間は別としてループと条件分岐に置き換えられないわけがない
ループのほうが常に簡単って言ってるやつは
もっと深いアーキ寄りの事を考えてるから簡単と感じるんだろ
抽象化や数学レベルの話ではない

455 名前:デフォルトの名無しさん [2015/08/23(日) 09:09:45.85 ID:hZLJ7+aO.net]
>抽象化や数学レベルの話ではない

そもそも等価なんだから
機械的に置き換える万能な方法があるから
「簡単だ」って言ってるんじゃね

456 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 09:36:44.01 ID:4UX4HcJn.net]
最底辺はループやジャンプで。
それより上位層になると人間様が読み書きし易い再帰で(最適化は底辺に任せる)。
もっと上位になるとループも再帰も使わず、誰かが用意した高階関数を使うだけ。

ってので合ってる?
自分で高階関数書くときは、ほとんどループで、たまに再帰。

457 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 09:47:58.57 ID:dUB2+H1B.net]
>>447
> もっと深いアーキ寄りの事を考えてるから簡単と感じるんだろ
そんなのは本来は機械にまかせること
高級言語はそういう考えを排除するようにできてきたんだからね
アーキのこと考えてやるならアセンブラ使ってレジスタのことでも考えておけばいい

458 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 09:53:47.88 ID:F/ISrncw.net]
世の中にはハード屋に
理論上最高性能の高級関数を作ることを要求される最底辺が居てな
オプソの大半は環境依存なくしてぬるく作ってあるから
実装としてはまだ最底辺ではないよ

459 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 09:58:49.19 ID:btbbls/X.net]
再帰が問題なのはスタックオーバーフローこの一点のみだよ。

460 名前:デフォルトの名無しさん [2015/08/23(日) 10:35:42.23 ID:hZLJ7+aO.net]
スタックを使わずに再帰すればいいだけ



461 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 15:29:52.83 ID:vCSJ96fF.net]
全部トランポリン化しよう(提案)

462 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 15:51:18.07 ID:FI0qqD1g.net]
スタックって今でも固定なの?
最近は動的にスタック領域増えたりしないの?

463 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 16:21:24.92 ID:nWiiCp/4.net]
保守性と可読性が高いならどんなコード書いてもいいよ
再帰だろうとgotoだろうとかまへんよ

464 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 17:58:27.10 ID:2tV8XcQZ.net]
コンピュータの本質は関数じゃなくてオートマトンなんだけどな

465 名前:デフォルトの名無しさん [2015/08/23(日) 19:17:08.80 ID:myL1fwDZ.net]
>>457
計算論の話なら抽象的なレジスタマシンでミニマルな計算可能関数のセットを
作り上げた後はレジスタマシンのことはまったく気にしないものだけどな

466 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 20:04:00.55 ID:5 ]
[ここ壊れてます]

467 名前:Eh/eQsv.net mailto: 再帰を毛嫌いするのは学が足りない
破壊的代入を毛嫌いするのは経験が足りない
[]
[ここ壊れてます]

468 名前:デフォルトの名無しさん [2015/08/23(日) 20:16:52.93 ID:c9xDZ4H5.net]
>>459
どっちつかずのタマムシ野郎はやる気が足りない?

469 名前:デフォルトの名無しさん [2015/08/23(日) 20:17:46.05 ID:c9xDZ4H5.net]
再帰で実装するクイックソートって全然クイックじゃないからな
あれクイック詐欺だからな

470 名前: ◆QZaw55cn4c mailto:sage [2015/08/23(日) 22:05:58.40 ID:GHcBJPT0.net]
>>461
??
でも,再帰は非再帰よりも遅いかもしれないようだね‥意外だ
codepad.org/4B8PijgI 再帰
codepad.org/AGfYeUmV ループ



471 名前:デフォルトの名無しさん [2015/08/23(日) 23:08:33.07 ID:c9xDZ4H5.net]
>>462
だぁかぁらぁ再帰でループ使ってんじぇねえぞカスこら

for (;;) {
 while (f(pi, pivot) < 0)
  pi += size;
 while (f(qi, pivot) >= 0)
  qi -= size;

 if (qi < pi)
  break;

 swap(pi, qi, t, size);
}

全部再帰で実装しろや卑怯者

472 名前:デフォルトの名無しさん mailto:sage [2015/08/23(日) 23:18:14.86 ID:cJWS/2ha.net]
高速処理を再帰で実装したらダメなんてことも知らんのか。
プログラミングの常識を欠き過ぎ。

473 名前: ◆QZaw55cn4c mailto:sage [2015/08/23(日) 23:28:45.86 ID:GHcBJPT0.net]
ふーん,常識なんだ‥
ニ方向に再帰する構造をループに書くのは大変だな‥
平衡ニ分木なんかどうすればいいのだろう‥

474 名前:デフォルトの名無しさん [2015/08/24(月) 00:02:19.68 ID:lwCfvpYi.net]
>>465
FreeBSDもLinuxも.NETもJavaも二分探索木(赤黒木)はループで実装されとりますがな

475 名前:デフォルトの名無しさん mailto:sage [2015/08/24(月) 00:21:55.88 ID:rSFKQba3.net]
>>458
こういうバカ

476 名前:デフォルトの名無しさん mailto:sage [2015/08/24(月) 09:13:29.48 ID:pjiRa/zc.net]
>>422 >>423 を絶滅危惧種として虚勢して動物園にいれとけ

477 名前:デフォルトの名無しさん mailto:sage [2015/08/24(月) 09:13:40.03 ID:X6qu577D.net]
>>465
スタックに積むコストを舐めすぎている

478 名前:デフォルトの名無しさん mailto:sage [2015/08/24(月) 10:54:15.45 ID:r4N2Q7ij.net]
>>462
そのコードじゃ重くて当然だと思うが
1処理単位のmalloc呼び出しが再帰は3回、ループは1回
そこ同じ数に直せばほぼ変わらないと思う

479 名前:デフォルトの名無しさん mailto:sage [2015/08/24(月) 13:27:36.75 ID:nAv/Kj8Z.net]
ループ処理方式では、メモリの確保・開放は最初と最後のみにすべき。

途中の処理でメモリの確保・開放をしないことで、望ましい高速処理が実現される。

480 名前:デフォルトの名無しさん mailto:sage [2015/08/24(月) 15:15:24.35 ID:zrEdzFeo.net]
スタックも再帰前にあらかじめ確保しておけば最強



481 名前: ◆QZaw55cn4c mailto:sage [2015/08/24(月) 21:17:22.61 ID:YG1kZeuQ.net]
>>470
なるほど

482 名前: ◆QZaw55cn4c mailto:sage [2015/08/24(月) 21:20:07.14 ID:YG1kZeuQ.net]
再帰版(かきなおし)codepad.org/U7f45Ah0
ループ版(再掲載)codepad.org/xvNqmIcZ

若干再帰版の方が早いようだ,スタックポインタはレジスタ一個で管理できるから軽いんだね

483 名前:デフォルトの名無しさん mailto:sage [2015/08/24(月) 21:55:55.71 ID:nAv/Kj8Z.net]
ループ処理方式の長所は
1処理単位のmalloc呼び出しを無しにできることなんだから
あってはダメ

484 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 00:51:04.35 ID:uonxIY7X.net]
そりゃ高速処理を突き詰めればループの方がいいに決まってる
再帰は問題をより小さい問題に分割することによってアルゴリズムを分かりやすくして
バグを混入しにくくすることが目的なんだから、速度はハナから求めてないしね

485 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 01:42:50.39 ID:pfa9oRBx.net]
逆に言えば、再帰を使ってもアルゴリズムが
わかりやすくならないなら使う意味もないし、
単に速度が遅くなるってだけなわけさ。

486 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 01:53:24.89 ID:bwlYR2I5.net]
まぁでもあれだよな
リストに関して言えば、リンクリストは重いので配列を使う
配列を使うと自ずとループ処理が多くなるわな

487 名前:デフォルトの名無しさん [2015/08/2 ]
[ここ壊れてます]

488 名前:5(火) 03:17:22.19 ID:36oEPfes.net mailto: 配列がリストの代替になるわけがないだろ
データ構造としての性質がぜんぜん違う
[]
[ここ壊れてます]

489 名前:デフォルトの名無しさん [2015/08/25(火) 03:47:16.58 ID:dXp7EQvt.net]
再帰自体がバグ。

490 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 07:19:29.79 ID:bwlYR2I5.net]
>>479
そのとおり
ほとんどの場合で配列の方が早い
だから配列を使う



491 名前:デフォルトの名無しさん [2015/08/25(火) 09:33:09.51 ID:36oEPfes.net]
はあ。配列のコストも理解してないとは…
なんでマトモにプログラム書いたこともないような奴ばっかりなんだ

492 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 09:47:35.65 ID:zI10HmeA.net]
>>482
バカはおまえだけ

493 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 15:43:56.61 ID:YISO+qUP.net]
>>482 「俺、息の吸い方知ってるんだよ。」っていう君みたいなのを誰も相手にしていないだけだ、「息の吸い方も分かりませんが、狩りがしたいです!」っていうほうがマシ、あるいは釣りであることを悟れ

494 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 19:31:30.11 ID:eVT/tzv+.net]
>>484
いやそれはおかしい例えだろ
そこで師範代から正しい呼吸法を学ぶ流れだぞ

495 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 20:16:14.30 ID:YISO+qUP.net]
>>485 この板やネット社会のどこに師範がいるんだよw必要な情報は全部上がっているんだよ、それを共有するかしないかだろ

496 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 20:34:31.94 ID:bwlYR2I5.net]
つまりお前らのような存在は、
リンクリスト使わずに配列使っとけば良いってこと
配列使っとけば、ループ処理に再帰を使おうって、
考えも浮かばなくなる
ほとんどの場合で良好なパフォーマンス
可読性もバッチリ

497 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 20:44:07.68 ID:uonxIY7X.net]
> 可読性もバッチリ
ここは違うよね

ループを使うということは手続きを追わないといけない
再帰なら定義をそのまま書ける
どちらが可読性がいいかどうかは言わずもがな

498 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 20:52:22.67 ID:zI10HmeA.net]
可読性は比較の問題じゃあない。
非実用的な再帰方式は採用できないのだから
実用的なループ方式を使うしかない。

ループ方式のコードは、より複雑になるとしても
読むことが困難なものではない。

プログラマに少し経験があれば、
再帰方式から安全で高速処理のできるループ方式に
自分で変更できるレベル。

499 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 20:55:10.03 ID:bwlYR2I5.net]
>>488
配列のループに再帰を使うのwwwww
それって読みやすいわけ?

500 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 20:57:06.79 ID:uonxIY7X.net]
>>489
> 再帰方式から安全で高速処理のできるループ方式に
> 自分で変更できるレベル。
変更できてもその結果バグを埋め込んだりしたら無意味
そうならないために可読性は重視されるんだから



501 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 21:02:19.58 ID:bwlYR2I5.net]
配列のループに再帰使うのは、可読性が良いわけ?
俺はリンクリストなんぞ使わずに配列使えっていってるわけで
ランダムアクセスできて便利

502 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 21:05:07.20 ID:bwlYR2I5.net]
しかも今風の言語だと、大体コレクションがあって、
range-based for が有るのに、
何でわざわざ再帰で書くwww

503 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 22:16:19.86 ID:zI10HmeA.net]
>>491
プログラマに少し経験があれば、
分かりやすくループ方式に直せるはず。

バグを埋め込まないレベルで
埋め込まれたバグが同僚が発見しやすいレベルで

504 名前:デフォルトの名無しさん mailto:sage [2015/08/25(火) 22:36:15.41 ID:JZwUbwZb.net]
最近の高級言語はforeach楽すぎよね

c/c++はくそいんだけど
どうせガチの実装するときだからあっても使わないどころか
ユニットで固めるから可読性とメンテナンス性はガン無視だわ

505 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 01:11:58.96 ID:fE8RXalP.net]
foreachはクソイのでmapとかfilterとか使おう

506 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 01:31:34.12 ID:5P6ATqZc.net]
再帰はクソイのでmapとかfilterとか使おう

同じ理論が成り立つから無意味だ

507 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 01:34:29.40 ID:fE8RXalP.net]
結局適切な使い分けが必要って話になる

508 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 01:52:36.91 ID:eIiWuCWx.net]
C++にもfor_eachあるし、再帰でmap使っても再帰になるだろ…

509 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 03:45:39.29 ID:tWuWD3CH.net]
>>475
>>474 でみたように,

510 名前:クイックソートのような再帰アルゴリズムをループ処理で記述すると malloc()/new の発生は回避できない []
[ここ壊れてます]



511 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 03:46:52.92 ID:tWuWD3CH.net]
>>476
>>474 でみたように「ループ処理の方が早い」とは必ずしもいえない.
再帰で記述したほうが速度が出る場合も結構あるのでは?

512 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 03:49:21.29 ID:tWuWD3CH.net]
>>482
最近急に「std::vector 一択だ!」論者が増えているようで‥

513 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 05:07:16.18 ID:CDX3RzQS.net]
>>500
ぼけ!
まだ書き直してねえじゃねえか。
さっさと1処理毎のメモリ確保解放をしない
ループ処理の通常版に直せ。

これを知らんのはお前が病的な世界にいるからだ。

514 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 07:31:12.39 ID:pCUEXLgh.net]
>>501
呼び出しオーバーヘッド削り込む実装しなきゃ
ループのほうがはやくはならんよ

OSSでもまともなのはそーいう実装になってるよ

515 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 07:39:26.46 ID:nL2sda9W.net]
>>500
> >>474 でみたように,クイックソートのような再帰アルゴリズムをループ処理で記述すると malloc()/new の発生は回避できない

回避できるでしょ?
最初っから必要になる最大メモリを確保すればいいんだよ。
最大がわからないなら、
そのサイズはスタックの最大メモリと同じ量でいい。

516 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 07:45:06.17 ID:tWuWD3CH.net]
>>503
ちゃんと,処理の頭と終わりで malloc()/free() するだけの構造にしたよ
ニ方向に再帰するクイックソートで,処理中にスタックに出し入れするから,
その分の malloc()/free() を使うのは不可避

>>504
まあそういうことだ‥
このスレのはじめのほうでは再帰のオーバーヘッドはかなり高いことになっていたが,
実はそうでもない

517 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 07:45:54.80 ID:tWuWD3CH.net]
>>505
>スタックの最大メモリ
ってなんだい?C で説明してくれ

518 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 08:06:15.93 ID:CDX3RzQS.net]
>>506
>ニ方向に再帰するクイックソートで,処理中にスタックに出し入れするから,
>その分の malloc()/free() を使うのは不可避

その分の malloc()/free() を使うなボケ
処理毎のメモリ確保解放をしないのが業界標準だ

極端に低レベルなコードを作り出してソートを語るな

519 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 09:03:59.69 ID:nL2sda9W.net]
>>507
スタックオーバーフローしたときの
スタックで使用しているメモリ量のことだよ。

520 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 15:30:14.05 ID:3EJSkE06.net]
続くねぇ。このページで終わる話じゃないの?

https://ja.wikipedia.org/wiki/分割統治法



521 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 20:04:00.33 ID:1FIsj9f5.net]
再帰を使えば分かりやすく書ける
ループを使えば高速化できる

トレードオフなだけだよね
高速化が必要ならループ使えばいいし、そうでもないなら再帰で分かりやすく書けばいい
前提条件がないのにどっちがいいとか決められる話じゃない

522 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 20:57:30.21 ID:tWuWD3CH.net]
>>511
その常識を覆す結果,すなわち
・再帰を使うほうが全般的に軽い,
・ループは分かりやすくない上におもったより重い
という結果が出ているんだよ

523 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 21:01:56.66 ID:nL2sda9W.net]
>>519
訂正

再帰を使えば分かりやすく書けることもある。
ループを使ったほうがわかりやすいことも有る。

ループを使えば高速化できる。

524 名前:デフォルトの名無しさん mailto:sage [2015/08/26(水) 21:27:00.60 ID:CDX3RzQS.net]
>>512
そんなバカ言ってるのはお前だけ。

さっさと世間で使われているクイックソートのアルゴリズムがどうなっているのか学習しろ。
このスレでさんざん多くのレスで非難されているのに、現実を理解できないお前は重病。

525 名前:デフォルトの名無しさん mailto:sage [2015/08/27(木) 00:24:39.98 ID:D5iVdV3D.net]
クイックソートをピュアに実装する事ってなくって
分割で要素数減ったら別アルゴに切り替えるでしょ
だから関数呼び出しのオーバーヘッドの影響が小さくなるのよ

それもデータ多いと遅いから
ミッションクリティカルに大量のソート回す場合は
パラのradixマージじゃないのか

おれはこう思ってたんだけど俺の認識間違ってる?

526 名前:デフォルトの名無しさん mailto:sage [2015/08/27(木) 02:53:00.07 ID:rEYgAb/R.net]
>データ多いと遅いから
まともなループ版

527 名前:のクイックソート使えばいいのに []
[ここ壊れてます]

528 名前:デフォルトの名無しさん mailto:sage [2015/08/27(木) 03:36:13.50 ID:4wYo+P+Y.net]
>>514
クィックソートするのに,データ数の前提をたててその分のメモリを先に確保するのか?
それが世間でやっていることなのか?
Cのライブラリ関数 qsort() で行われていることなのか?

529 名前:デフォルトの名無しさん mailto:sage [2015/08/27(木) 03:40:39.00 ID:zsRIAfpU.net]
二つのメモリ内容の
入れ替えしか行ってないのに、
なんで別にメモリを確保しなきゃいかんのだ?

530 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2015/08/27(木) 03:48:48.52 ID:oqQcnINP.net]
二重再帰のお題:
int f(int x,int y) {
if (x > 0)return f(x-1,y)-1;
if (y > 0)return f(x+1,y-1)+3;
return 1;
}
さて、f(3,8)はいくつ?



531 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2015/08/27(木) 03:52:04.42 ID:oqQcnINP.net]
再帰は人工知能と関係がある。

532 名前:デフォルトの名無しさん mailto:sage [2015/08/27(木) 10:07:26.43 ID:1OqAD7+d.net]
再帰は人工知能の研究のためのもの
ソースコードとその処理結果の組み合わせを見るもの

実用的なプログラミングにはC++とか他の言語を使う

533 名前:デフォルトの名無しさん [2015/08/27(木) 23:36:19.60 ID:3Gk4Wjfj.net]
2週間くらい見てなかったけどずいぶんまともになったね。
MISRA-C だの 2chコーディング規約だのと叫んでた人達はどこに行ったの?

>>517
gcc qsort.c
でググれば出てくるから見てみたらどうかな。

534 名前:デフォルトの名無しさん [2015/08/27(木) 23:44:42.40 ID:3Gk4Wjfj.net]
ごめん、間違えた。URL 書くよ。>>163 に書かれてるのと同じだけど。
https://github.com/lattera/glibc/blob/master/stdlib/qsort.c

535 名前:デフォルトの名無しさん [2015/08/28(金) 00:07:34.86 ID:X6i2EJ+K.net]
glibc qsort.c
でググればいいらしい。

536 名前:デフォルトの名無しさん [2015/08/28(金) 01:56:03.91 ID:5JQ0ubd6.net]
クイックソートは問題を分割して各々を解くだけだからループでも簡単なんだよ。
再帰処理をループにしても読みにくくならないって言う人は、竹内関数を再帰呼び出し無しで書いてみること。
書けない人は議論に参加する資格無し。

537 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 02:00:35.89 ID:k07is2fO.net]
竹内関数は実際には使われないので何とも
実際にもっとも使われるデータ構造は配列です
配列のループに再帰を使うのはナンセンスです

538 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 05:01:09.44 ID:Ox2JHydA.net]
>>525
まだ勘違いしてるの?

ループでも簡単なものを
わざわざ再帰で書くんじゃねーよって
話をしてるんだが。

539 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 06:01:37.78 ID:uG+DCu7f.net]
>>522
man ばかりでてくるんだけど‥

540 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 10:15:07.18 ID:McJH/vOC.net]
ループでも簡単なものを
わざわざ実用性のない再帰で書く

再帰キティ害は、どこまで病的なんだか・・



541 名前:デフォルトの名無しさん [2015/08/28(金) 21:21:58.14 ID:5JQ0ubd6.net]
>>527
ループで簡単に書ける問題でも
再帰で「もっと」簡単に書けるなら再帰で書くよ

542 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 21:27:38.78 ID:McJH/vOC.net]
>>530
脳みそ腐ってる

再帰のベンチマークでいつまでも遊んでろ

543 名前:デフォルトの名無しさん [2015/08/28(金) 21:30:07.36 ID:5JQ0ubd6.net]
>>531
GOTOで簡単に書ける問題でも関数使うのと同じだよ

544 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 21:33:32.50 ID:k07is2fO.net]
もっともよく使うデータ構造は配列です
配列のループに再帰を使うのはナンセンスです

545 名前:デフォルトの名無しさん [2015/08/28(金) 21:35:35.21 ID:5JQ0ubd6.net]
もっともよく使うデータ構造は木です
木の探索にループを使うのはナンセンスです

546 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 21:35:43.99 ID:p8e2JvhL.net]
リンクリストを使った方が簡単になるならそうするよね

547 名前:デフォルトの名無しさん [2015/08/28(金) 21:36:22.40 ID:5JQ0ubd6.net]
1+2*3+4*5-6/7*8+9*10

木です

548 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 21:37:14.01 ID:k07is2fO.net]
木構造よりも配列の方がよく使います

549 名前:デフォルトの名無しさん [2015/08/28(金) 21:38:08.70 ID:5JQ0ubd6.net]
>>537
それは単価の安いエンジニアだからです

550 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 21:38:50.59 ID:p8e2JvhL.net]
何でもかんでも配列を使う方がどうかしてる
問題によってデータ構造を選ぶのが適切



551 名前: []
[ここ壊れてます]

552 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 21:39:52.00 ID:k07is2fO.net]
>1+2*3+4*5-6/7*8+9*10

>木です

これの面白い点は、
通常パーサで再帰下降型など再帰が使われることは無いということです

553 名前:デフォルトの名無しさん [2015/08/28(金) 21:42:13.29 ID:5JQ0ubd6.net]
gotoが使われます

554 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 21:43:36.30 ID:k07is2fO.net]
なんでも配列を使うとはいっていません
もっともよく使われるデータ構造は、配列だと言っているだけです
もっともよく使われるデータ構造である配列のループに
再帰を使うのはナンセンスです
配列を良く使うことと、ループ分を良く使うことは、同義と言って良いでしょう
配列はよく使われるので、ループも良く使われます

555 名前:デフォルトの名無しさん [2015/08/28(金) 21:46:23.84 ID:5JQ0ubd6.net]
配列が命令を格納したものなら通常はgotoで飛びます。ループのようなオーバーヘッドの大きな処理は使われません

556 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 21:48:29.35 ID:3pAHpuiu.net]
1+2*(3+4*(5-6))/7*(8+9)*10!

557 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 21:58:33.93 ID:k07is2fO.net]
一般的にプログラムでもっともよく使われる構造的なデータといえば、文字列でしょう
文字列の表現には配列が適しています
つまり、配列はとても沢山使われるということです
配列の操作にはループ文が適しています
配列で表現された文字列に対して、
strlenなどの文字列操作を再帰で実装するのはナンセンスです
つまり、ループ文はとても沢山使われるということです

558 名前:デフォルトの名無しさん [2015/08/28(金) 22:03:28.46 ID:5JQ0ubd6.net]
一行目が違います

559 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 22:23:58.40 ID:bBNOiFa3.net]
>>546
正しくはなに?

560 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 23:01:39.79 ID:p8e2JvhL.net]
>>542
ちなみにScalaとかでは配列を使うのはパフォーマンスを求めるときぐらい
ふつうに順序づけられた集合を表すのはList(という名のリンクリスト)だよ



561 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 23:10:55.11 ID:bBNOiFa3.net]
Scalaというよく使われない言語を持ってこられても困るよなw

562 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 23:14:12.40 ID:p8e2JvhL.net]
え?よく使われてるよ?
Twitterとか、日本でもドワンゴとかね

563 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 23:14:42.73 ID:bBNOiFa3.net]
それ以外では使われてない。

564 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 23:15:03.90 ID:cjHddNQ+.net]
お前らはLispを書かんのか?
業務でぇとか、しみったれたこと言うなよ。

565 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 23:15:34.96 ID:bBNOiFa3.net]
業務以外なら書くよ。

566 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 23:19:28.80 ID:p8e2JvhL.net]
他にもいっぱい使われてるよ
ちょっと調べれば出てくる

567 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 23:25:39.66 ID:cjHddNQ+.net]
Lisp書くなら、配列の何とも言えない不自由さに辟易しているのでは?
ただしループは認める。やはりスタックが...

568 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 23:32:38.56 ID:bBNOiFa3.net]
>>554
githubのランキングを見たが少なかったぞ。

そんなデータ信用できねーよと言うのなら、
それはそれでいいが、それなら君が信用できて
誰でも検証可能なデータを示すべきだ。

569 名前:デフォルトの名無しさん mailto:sage [2015/08/28(金) 23:48:40.83 ID:k07is2fO.net]
配列はランダムアクセスが出来て便利
リンクリストはランダムアクセスが出来ないので不便
なので、配列の方が、より、汎用性のあるデータ構造といえます
使い勝手のいいデータ構造を採用する事は、可読性に繋がります
一般に配列は、挿入、削除、リサイズが遅いとされていますが、
単に、そういう風に対立構造にして、場合に応じて使い分ける風に言ったほうが、
かっこいいから、そう言っている、というだけです
例えば、クリエイティブならMac、という紹介文章みたいなもんです
リンクリストにも華を持たせてあげましょう、というだけです
配列の挿入、削除、リサイズは、そこまで遅いわけではありません
memcpy memmoveはカリカリにチューニングしてあり、とても速いです
CPUのキャッシュに乗りやすい処理であるのもポイントです
最近のPCのメモリ帯域を確認してください
対して、リンクリストのランダムアクセスは、とても重いです
CPUのキャッシュに乗りにくい処理です

570 名前:デフォルトの名無しさん [2015/08/29(土) 00:15:20.73 ID:hP/roqxQ.net]
いつから配列のリサイズが重くなくなったんだw



571 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 00:41:01.81 ID:bUE2FMpc.net]
メモリ確保・解放の重さは、回数が問題

処理中にメモリ確保・解放しまくるデータ構造は、

572 名前:とんでもなく重い。 []
[ここ壊れてます]

573 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 00:44:15.53 ID:haT66cVy.net]
スタックとか関数呼び出しのために
メモリ確保・解放してるからなぁ。

574 名前:デフォルトの名無しさん [2015/08/29(土) 00:52:02.37 ID:abZzEG6q.net]
プログラム関係について語り合うならBeLongs!がおすすめ。
よかったら、「blngs」で検索してみて!

575 名前:デフォルトの名無しさん [2015/08/29(土) 02:02:43.87 ID:TLrhTEkt.net]
>>559
せやろか?
俺の経験では処理の遅さはメモリ確保の回数よりも
メモリのサイズに比例する。

576 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 02:06:54.96 ID:g5UyIGYz.net]
俺の経験では、
処理の重さはメモリ「開放」の回数に比例する
無論C/C++のfree/deleteの話だが

577 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 02:32:09.50 ID:haT66cVy.net]
メモリ確保って言っても律儀に
指定したメモリを毎回確保・解放してるわけじゃないからな。

ある一定サイズをどかんと確保して、
ちょこちょこ割り当てて使用している。

578 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 02:45:20.83 ID:g5UyIGYz.net]
ドカンと確保せず、毎回OSのページサイズ単位で確保した方が早い
WindowsならVirtualAlloc これは速い
mallocなどドカンと確保して、ちょこちょこ割り当てる、これが全く重い
正確には割り当てるのは速い 解放がとてつもなく遅い

579 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 03:55:56.31 ID:VNb5NXe3.net]
メモリの確保/解放を考える時点でなんか違うよ

もちろん、そこまで考えなきゃいけない分野はあるし、そういう分野で再帰を使うのは間違ってると
思うけど、一般の人間はそこまで考えなくていいからね

580 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 06:20:13.75 ID:sPvi53Zp.net]
メモリの確保/解放を考えないなんてもう論外。

プログラマとしてまともな仕事を扱うこともなく
任されることもない、
いい加減なコードを書くだけで信用も期待もされない。

これ一般じゃあない。



581 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 06:48:33.39 ID:e0Hg3/HL.net]
配列などない
ポインタがあるだけだ

582 名前:デフォルトの名無しさん [2015/08/29(土) 06:54:58.07 ID:hP/roqxQ.net]
世の中にはC言語以外の言語もあるのよ

583 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 13:05:13.99 ID:VNb5NXe3.net]
>>567
そこまで考えなきゃいけない分野があるのは事実だが、それをマニュアルでやる分野はレア

マニュアルでやってたら絶対バグるから、モダンな言語にはガベージコレクタなどの技術が
採用されてるんだしね

584 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 13:57:09.93 ID:7eeJLuGb.net]
>>531 ワロタ。お前道具もまともに使えない社畜だな、もう別のとこ行くか、黙ってみてろ

585 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 17:10:01.35 ID:g7aWBHc9.net]
別に再帰だから再帰じゃないからなんだって思うが

586 名前:デフォルトの名無しさん mailto:sage [2015/08/29(土) 18:43:39.65 ID:g7aWBHc9.net]
>>568
アドレス演算≠ポインタ演算

587 名前:デフォルトの名無しさん mailto:sage [2015/08/30(日) 14:09:15.19 ID:PCX+Z6xE.net]
>>559
calloc?…

588 名前:デフォルトの名無しさん mailto:sage [2015/08/30(日) 14:09:53.80 ID:PCX+Z6xE.net]
>>574
ごめんなさい誤爆しました

589 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 01:14:01.81 ID:t91IYFQ3.net]
>>542
いやいや
スクリプト言語だと配列という名前でもハッシュだったりするし
最近は配列を多用するのはc/c++(c++あんま知らんけど)くらいだと思うんだけど
javaでもなるべくコレクション使うようにするし

590 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 01:16:56.25 ID:t91IYFQ3.net]
配列はデータの追加や削除の効率が悪いデータ構造だし
immutableに向いてないからキツイ



591 名前:デフォルトの名無しさん [2015/09/01(火) 02:05:52.14 ID:DJMTd98b.net]
"スタックオーバーフロー" "クイックソート" site:.ac.jp
でググったら、とっても残念なページを見つけてしまった。
素人ならまだしも、T 大学の N 先生、あなたがそんなことじゃだめでしょう。
クイックソートがスタックオーバーフローするのは recursive call のせいではありませんよ。

592 名前:デフォルトの名無しさん [2015/09/01(火) 02:14:07.76 ID:6K59ZHF3.net]
>>577
その人、たぶん、なんでデータの追加や削除の効率が悪いのかもわかってないのでは、と。

593 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 03:08:24.61 ID:ucFEbRDO.net]
>>577
その人、たぶん、配列=メモリに連続して固定長のデータが並んでいるもの
それ以外は認めない。という間違った考え方をしてる。

594 名前:デフォルトの名無しさん [2015/09/01(火) 03:11:38.75 ID:Uqk8gU8P.net]
>>578
recursive call のせいですよ

595 名前:デフォルトの名無しさん [2015/09/01(火) 03:12:23.69 ID:Uqk8gU8P.net]
>>580
間違ってないですよ

596 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 03:14:38.29 ID:ucFEbRDO.net]
>>582
やっぱり固定長データが連続で並んでるものしか
認めないと思ってるのかw

明らかに間違ってるぞ。
C言語以外の言語の話をしようか?

597 名前:デフォルトの名無しさん [2015/09/01(火) 03:29:20.63 ID:6K59ZHF3.net]
連続じゃなくてもいいけど(しかもハッシュじゃなく)アクセスがO(1)な
アドレスマッピングの方法を使ってる言語なんかあるの?

598 名前:デフォルトの名無しさん [2015/09/01(火) 03:29:25.49 ID:Uqk8gU8P.net]
>>583
C言語以外じゃないと都合が悪いのか?
じゃあC言語でお願いします

599 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 03:30:24.33 ID:ucFEbRDO.net]
>>585
あ、C言語限定じゃないと困るんだw

600 名前:デフォルトの名無しさん [2015/09/01(火) 03:32:07.57 ID:Uqk8gU8P.net]
>>586
はい、基本C言語でお願いします
よろしくお願いいたします
配列=固定長データが連続で並んでる
これでいいですね



601 名前:デフォルトの名無しさん [2015/09/01(火) 03:32:28.71 ID:Uqk8gU8P.net]
ふぅ、論破完了

602 名前:デフォルトの名無しさん [2015/09/01(火) 03:32:41.75 ID:6K59ZHF3.net]
単に「配列」って名前の付いてるハッシュの話してるんじゃないかと思う。
そしてそれは(データ構造としての)配列ではない。

603 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 03:33:05.52 ID:C9NG6GGp.net]
配列は抽象化されていないデータ構造なのか?

真にそう言えるのは1ビットのみである

604 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 03:40:53.92 ID:ucFEbRDO.net]
>>587
C言語においては、配列は固定長データが連続で並んでる。
その他の言語ではそうとは限らない
だから"配列"だけで断定することは出来ない。

これでいいですよ。

605 名前:デフォルトの名無しさん [2015/09/01(火) 03:44:11.25 ID:Uqk8gU8P.net]
>>591
C言語はプログラム言語です
つまり、プログラムにおいて配列とは固定長データが連続で並んでるものなんです

606 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 04:07:30.08 ID:ucFEbRDO.net]
わかりやすく言うと

プログラム言語 というカテゴリの中に
 ・C言語
 ・Perl
 ・PHP
 ・Ruby
 ・その他
 などが含まれます。

その中で、C言語では配列とは固定長データが連続で並んでるものなんです

607 名前:デフォルトの名無しさん [2015/09/01(火) 04:14:14.53 ID:Uqk8gU8P.net]
>>593
C言語以外では困るのでC言語でお願いしますと言いました。
いいですか、私はC言語以外では困るんです。
あなたは私を困らせたいのですか?困らせたくないでしょう。
私に同情してください。
配列=固定長データが連続で並んでる
これでいいですね。

608 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 04:19:55.14 ID:C9NG6GGp.net]
>>593
スクリプトだらけなんだが…

609 名前:デフォルトの名無しさん [2015/09/01(火) 04:24:44.91 ID:6K59ZHF3.net]
つうか、C言語のもの以外それみんな名前が「配列」なだけのハッシュ…

610 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 04:33:56.34 ID:ucFEbRDO.net]
配列の実装がハッシュなだけ。
配列だからって、実装まで決まらない証拠。



611 名前:デフォルトの名無しさん [2015/09/01(火) 04:37:44.81 ID:Uqk8gU8P.net]
>>597
ふうむ、たとえば二分探索木の実装に赤黒木やスプレーツリーがあるように
データ構造にも抽象的なものとより具体的なものがあるわけっしょ。
つまり、抽象データ構造としての配列とより具体的なデータ構造としての配列があり、
抽象データ構造としての配列に連想配列が含まれ、より具体的な連想配列のデータ構造として
ハッシュテーブルがあるってことでしょね。

612 名前:デフォルトの名無しさん [2015/09/01(火) 04:57:20.77 ID:6K59ZHF3.net]
データ構造についての普通の教科書読めば
そういう緩い意味で「配列 array」は使わないことがわかるよ。

613 名前:デフォルトの名無しさん [2015/09/01(火) 04:58:46.51 ID:6K59ZHF3.net]
array data structureとarray data typeとの区別をつけようね。

614 名前:デフォルトの名無しさん [2015/09/01(火) 05:04:47.15 ID:6K59ZHF3.net]
細切れに書いちゃってアレだけど、
array data typeはその実装がリストでもいい。
だから、効率性を云々する時のarrayはarray data typeではなくて
array data structureの話じゃなきゃいけない。そしてarray data structureは
インデックスからアドレスへの容易な算術演算によって(典型例が
データの連続配置)、O(1)アクセスを可能にするデータ構造。

615 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 06:38:20.62 ID:lctJDoUS.net]
いや、そんな長々と説明しなくていい

616 名前:諱B
array data structureがO(1)でなければならないというのなら
それを定義したのはどれかを言ってくれればいい。
おそらく無いからそれをごまかすために説明してるんだろうと思ってるけどねw
[]
[ここ壊れてます]

617 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 07:30:15.06 ID:CkpgYLyf.net]
>>594
うわあ、これはマジモンでヤバい人だ…

618 名前:デフォルトの名無しさん [2015/09/01(火) 08:00:49.42 ID:/DoXUIG1.net]
tet

619 名前:デフォルトの名無しさん [2015/09/01(火) 08:05:00.21 ID:/DoXUIG1.net]
メモリの取得、解放なんかは
OS自体にその手の機能が存在してるべきなんだよ
速度をそこまでガチで求めない場合の簡易版で良い

620 名前:デフォルトの名無しさん [2015/09/01(火) 08:11:25.32 ID:KtW8DmAo.net]
ゲーム木探索とかの再帰じゃないとできないことぐらいしか再帰関数でやらない
逆に再帰関数はforやwhileに書き換えできる? 出来るならそっちにしたいレベル



621 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 08:25:26.84 ID:vcgHCiFQ.net]
テンプレートメタプログラミングやC++11のconstexprだと、どうしても再帰使わないと書けないコードでてくる……
あれってなんか解決策あるんですかね……
怠惰なインスタンス化のように無限再帰を回避する方法ならあるけど

622 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 12:55:10.42 ID:4i2DmfPV.net]
>再帰じゃないとできない

まず無い。
再帰でベンチマーク作るのでなければ。

623 名前:デフォルトの名無しさん [2015/09/01(火) 13:38:18.55 ID:DJMTd98b.net]
>>581
君に理解できる話じゃないよ。
クイックソートのスタックオーバーフローを防ぐためと称して
非再帰化しろだのスタックサイズを増やせだのと、
君程度の人なら言うかもしれないが、大学の先生がそんなことじゃ困る。
空間計算量の最適化を教えなさいよという話だ。
それ無しに非再帰化だのスタックサイズだのと言われる学生さんが可哀想だ。

624 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 13:48:33.08 ID:4i2DmfPV.net]
>>609
君ごときの無能にそんなことじゃ困るなんて言われる
先生がかわいそうだ。

625 名前:デフォルトの名無しさん [2015/09/01(火) 15:23:42.04 ID:6K59ZHF3.net]
>>602
data typeじゃなくて data structureとしてのarrayなら下にあるけど?
常識なんで、定数アクセスじゃないadsがあるというならむしろそっちが実例挙げてね

https://en.wikipedia.org/wiki/Array_data_structure

626 名前:デフォルトの名無しさん mailto:sage [2015/09/01(火) 19:15:05.37 ID:jZfLWulg.net]
大学と共同研究とか外注受けたりとかやったことあるやつは
大学の先生の技術レベルがやばいのは経験してるでしょ

いまさら騒ぐ事でもねーよ

627 名前:デフォルトの名無しさん mailto:sage [2015/09/02(水) 00:47:36.69 ID:kkVdXJxG.net]
サイ基地外は現実を否定することしかできない

628 名前:デフォルトの名無しさん mailto:sage [2015/09/02(水) 17:48:58.50 ID:pfz+JPDH.net]
メモリ上でスラッと並んでるのが配列であって
そうじゃないけど並んでるように見えるのは
あんまり配列とは呼びたくないでござる。

629 名前:デフォルトの名無しさん mailto:sage [2015/09/02(水) 19:19:55.89 ID:DAe+xWqL.net]
組み込みや専用機なら配列と言う概念はいらない

630 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 02:22:06.78 ID:APM+2rA2.net]
位置の並びは関係なく、演算だけで区別できるのが配列
Rubyの配列はRuby用語



631 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 11:36:04.16 ID:hDY8eKzg.net]
こんなにも配列の話題で盛り上がるとは
みんな配列が大好きだね
人気者の配列のループには繰り返し文を使うから
繰り返し文は不滅だね

632 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 11:44:10.96 ID:HOkCudGK.net]
>>614
わかる。配列とコレクションは別だよな。

633 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 12:12:06.19 ID:dGS6eFW0.net]
配列の処理もforじゃなくて再帰で書くんだがやめたほうがいいのかね

634 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 12:26:06.74 ID:hDY8eKzg.net]
>>619
具体的にどんな感じで?

635 名前:デフォルトの名無しさん [2015/09/03(木) 14:27:45.88 ID:9nQXwra1.net]
>>620
head, tail,

636 名前:append さえあれば普通のリストとほぼ変わらん []
[ここ壊れてます]

637 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 15:43:06.69 ID:dGS6eFW0.net]
>>620
hoge(input, output){
  if (size(input) == 0) {
    return;
  }
  return hoge(tail(input), output.append(dosomething(tail(input))));
}

こんなかんじ

638 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 18:02:46.75 ID:IwEVB15/.net]
わざわざ再帰を使うなんてやめた方がいい。

ちゃんとループで書く技術を身につけるべき。

639 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 18:37:19.10 ID:dGS6eFW0.net]
forのほうが手軽なんだけど、しょーもないインデックスミスしちゃわない?
最近はどの言語も範囲forがあるから、まだいいんだが

640 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 19:27:47.89 ID:FSKtVBgW.net]
> forのほうが手軽なんだけど、しょーもないインデックスミスしちゃわない?
あんまりないな。いつも書き方一緒だし。
それ以外の書き方をしていれば「?」となる。



641 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 19:39:17.92 ID:6KaE3e8w.net]
単に慣れの問題

642 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 19:55:45.70 ID:Fz3Ka6Ix.net]
>>624
しょーもないミスをしないためにも再帰は覚えておくべきだね
使いドコロはケース・バイ・ケースだけど
何が何でも再帰を避けるようなことさえしなければいいんじゃない?

643 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 20:37:42.86 ID:FSKtVBgW.net]
>>627
forは範囲forで対応できるけど、
再帰は、範囲再帰ってあるの?w

再帰のほうがしょーもないミス多いよね。
終了条件ミスってスタックオーバーフローw

644 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 21:22:18.75 ID:qp+WFxZL.net]
範囲forに対応するものは高階関数になるんでね?
なんでもできてしまうforよりかは
畳み込み、map,foreach, filterなんかで使いわけたほうがいい

645 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 21:23:50.62 ID:qp+WFxZL.net]
後は >>= , <*>

646 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 22:32:32.63 ID:FSKtVBgW.net]
>>629
> 範囲forに対応するものは高階関数になるんでね?

そんなわけない。
範囲だろうが範囲じゃなかろうがforはfor。

647 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 22:52:40.78 ID:qp+WFxZL.net]
拡張for文はIteratorを実装しなけらばならなかったりforeachメソッドがなきゃいけなかったりbegin/endがなきゃいけなかったりするから
ある程度抽象的だから
whileと同じような単純な構文であるforと同じだって言われると微妙な気持ちになる

オブジェクト指向ありきみたいな

648 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 22:55:55.75 ID:K5TdrWRE.net]
便利だけど本質的には普通のforと同じ。
便利だけど単なるシンタックスシュガー

なにより副作用のために使うものだから
関数型的ではない。

649 名前:デフォルトの名無しさん mailto:sage [2015/09/03(木) 23:50:51.54 ID:LEFvEBee.net]
問題の解き方を探るときにwholemeal approachをやろうとすると、再帰は宣言的なんでスタート地点にしやすい。
dynamic programmingでやることにしても、最初の明快だけど遅い関数を書くときは再帰が多い。
そっからチューンしていったものが正しいかを検証したいとかよくある。
ので、再帰もループもどっちもある程度便利に使える言語は便利よ。

650 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 07:55:30.31 ID:iLm0cn85.net]
>>633
0点。



651 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 09:21:42.12 ID:QpES+Y0P.net]
宣言的な書き方は、総じて手続き的な書き方よりコードが短くなるため可読性が高い。ただし抽象度も上がるため、読む人を選ぶ可能性がある。

例えば以下の関数定義、手続き的に素直に書こうとするともっと長くなるはずだが、こう書かれても理解できない人もいるかもしれない。

f(n) =
| 0 (n = 0 のとき)
| n + f(n - 1) (n > 0 のとき)
| -f( |n| ) (n < 0 のとき)
なお、n は整数。


俺は宣言的な書き方が好き。

652 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 10:16:03.02 ID:qqcvyIbf.net]
数学における関数の、定義域別の関数定義みたいな書き方っすね

653 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 13:15:00.48 ID:YC3FOSdx.net]
結局、元の定義が再帰的でないと、再帰を使う意味は無いんだよな
プログラミングでもっとも良く使うデータ構造は配列ですし、
配列のループ処理を再帰とみなす必要は無いですし、
繰り返し文であふれるのは自然だね

654 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 17:32:01.47 ID:45GRgS6i.net]
>>635
理由書いてないので無視するw

655 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 18:34:45.30 ID:FR19Rjgq.net]
再帰キティは、理由なんか無く難癖つけるだけのレスばかり

656 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 20:04:17.17 ID:RgFRqfXr.net]
>>638
数学的に突き詰めれば自然数だって帰納的に定義されるものなんだから、
ループは必ず再帰に置き換えられるね(もちろん逆もまた真)

したがって意味がないことはない
あとはどっちが読みやすいかだけの話

モダン言語の流れは手続き的なループをなくして、再帰や高階関数を使う
方向のようだけどね

657 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 20:31:46.45 ID:K7Q0EkNO.net]
再帰とループの違いはなに?
手順をスタックしてるかどうかでしょ

まぁループと再帰を別に考えてる(と言うか感じてる)時点で三流くささがするのだけど

658 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 20:32:19.95 ID:FR19Rjgq.net]
それモダン言語じゃなくて、性能の悪い非実用的な言語なだけ

659 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 20:55:16.54 ID:RgFRqfXr.net]
>>643
最近はマシンスペックが上がってるからね
性能より抽象的な書き方ができるのを求めるようになってるんだよ

性能カリカリに求めたい場合だけCとか使っておけばいい世界

660 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 21:38:09.28 ID:vuZU5Hwi.net]
>>642
> 再帰とループの違いはなに?

ループ・・・小学校で習う(1から10までの数字を足し算しょう等)
再帰・・・高校で習う。(1からnまでの自然数の和を計算式で表す)



661 名前:デフォルトの名無しさん [2015/09/04(金) 21:49:10.66 ID:q06Od88z.net]
>>645
まったく理解できてない……

662 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 21:49:46.26 ID:vuZU5Hwi.net]
>>646
「間違ってる」とは言わないんだなw

663 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 21:54:59.88 ID:K7Q0EkNO.net]
なんかどうでもいいや

664 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 21:59:29.06 ID:vuZU5Hwi.net]
はい、反論も出なかったわけで、
つまりループと再帰ではループのほうがわかりやすいんだよね。

単純なループじゃない場合は、再帰のほうがいい場合もある。
だけどループでいいのならば、ループのほうがわかりやすい。

それは小学生でもループを理解していることからわかる。
(小学生にループというのは、nにn-1を足すのを0になるまで繰り返すとか言ってもわからない)

665 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 22:17:32.25 ID:6Rt4goII.net]
最新の実験的な言語で昔の関数型に回帰して再帰に走ってるの
単に言語開発のネタ切れしてるだけじゃねぇの

開発サイドの人間が必死こいて宣伝してるんだったら気持ちもわかるが
ユーザーだったらもっとマシな言語あるでしょとしか言えない

666 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 22:24:44.42 ID:q06Od88z.net]
>>647
根底から間違ってる、って言えばよかったの?

まず、(((((((((1+2)+3)+4)...+10) は典型的な再帰構造。ループでもなんでもない。

そして和の公式 n*(n+1)/2 は再帰でも何でもない閉じた式表現
(というか、再帰を使わない式にすることこそがその眼目だ)。

667 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 23:01:37.97 ID:vuZU5Hwi.net]
1から10まで足せって
小学生に言って、そんな式書く奴いないなw

普通は
1 + 1 = 2
2 + 2 = 4
4 + 3 = 7
7 + 4 = 11
って計算するんだぜ。

これを10まで繰り返す。
まさにループ

668 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 23:20:57.61 ID:q06Od88z.net]
>>652
それ全然ループじゃないから。

669 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 23:24:17.87 ID:q06Od88z.net]
n-1 までの和に n を足せば nまでの和が得られる、という原理に忠実な計算なんで
再帰以外のなにものでもないんだけど、基礎論触ったことないとわかんないかもね。

670 名前:デフォルトの名無しさん [2015/09/04(金) 23:26:41.39 ID:yf6WF608.net]
>>654
わかったところでカスだけどな。
再帰っていうのは木偶の坊の代名詞。



671 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 23:28:22.98 ID:kQbi8Wuv.net]
一つの見方しかできないのは数学に向いてないよ

672 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 23:29:28.63 ID:vuZU5Hwi.net]
>>653
ループじゃんw

書けば理解できるのか?

int sum = 0;
for(int i = 1; i <= 10; i++) {
 sum = sum + i;
}

これをステップ実行したのが>>652

673 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 23:30:53.74 ID:K7Q0EkNO.net]
おまえら夏休みは終わったんだぞ

674 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 23:33:40.85 ID:vuZU5Hwi.net]
>>658
9月にそれを言うってことは
お前大卒(もしくは在籍)じゃないのか?

675 名前:デフォルトの名無しさん mailto:sage [2015/09/04(金) 23:43:51.99 ID:RgFRqfXr.net]
>>655
分かったなら再帰が役に立つことぐらい簡単に理解できそうなもんだけどなー
理解できないならわかってないんだよ

676 名前:デフォルトの名無しさん [2015/09/05(土) 00:20:19.44 ID:LWQiKMu8.net]
>>660
ループの方が100億万倍やくに立つ。
再帰は数学に憧れてるだけで数学できない出来損ない野郎が使う。

677 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 00:45:04.95 ID:j+vMQGdO.net]
いや、goto の方が1000億万倍役に立つだろ。

678 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 00:56:03.07 ID:dKM7sd/0.net]
a. 再帰は不要
b. ループは不要
c. どっちも欲しい
d. 言語に合わせる

aとb(いるのか?)に精神病患者がいるせいで、
cの人の投げた話題を勝手にa(あるいはb)の人間の主張と見なして攻撃するのがおかしい。
aに反駁したらループ不要派だとレッテルを貼られ、
bに反論したら再帰理解できない馬鹿とレッテルを貼られるが、そもそもnot a != bだしnot b != aだからな。

再帰関数を作る時は、頭に保持しなきゃならない情報が少ないのがいいよ。
f(n)の定義を使ってf(n)を定義できるイメージ。場合分けだけで済む。
古典的なインデックスを使うforループより、要素を1つずつ取り出すっていうのが明確なforeachが好まれるのも似た理屈だと思う。

679 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 01:09:05.88 ID:dKM7sd/0.net]
あと、再帰はパターンマッチがあると途端に利便性が上がる。
例えばリストの要素を2つ以上必要とする処理を書くとき、OCamlだと
let rec foo acc xs = match xs with
| x :: y :: rest -> foo (do_something x y acc) y::rest)
| _ :: [] | [] -> finish_something
みたいに書けて楽。ループだとインデックスの範囲とか終了条件とか色々考慮しなきゃならんので手間がかかる。

680 名前:デフォルトの名無しさん [2015/09/05(土) 01:13:53.21 ID:LWQiKMu8.net]
>>664
パターンマッチは邪道
ナローイングなキャストを誤魔化してるだけ



681 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 01:22:40.76 ID:9u1zKCQd.net]
邪道でもなんでもないよ
これを邪道とか言ってるのはCとかにどっぷり漬かった人間のただの負け惜しみ

682 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 04:48:42.79 ID:Bq/cKCjD.net]
どっちの書き方も使うからどっちが良いも悪いも邪道もどうもない


ただし再帰のを話題にするなら、一回その楽な書き方で書いてから、正しい書き方に直すような前提の話になる
CPUやメモリを隠してる状態でこの話は有り得

683 名前:ない
再帰かどうかと言うのは、CPUとメモリの使いかた (の人間的な概念) を指すものだから。

この手の話題を出す限りは、Pythonが仕様書兼動作テストで、それを手動最適化して直したのが Cの実装 なんてのも十分有り得る
ま、さらに深くまで考慮するとまったく区別のしようがない同じ物なんだけどね。

ちょっと前に Rubyでしか使えないRuby用語の配列を、まるで本物の配列のように思い込んでた人がいたね。
再帰も再帰でそれと同じ。もちろんループも。
特定の言語内部だけの話ならそちらのスレにどうぞ。
[]
[ここ壊れてます]

684 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 06:52:05.04 ID:BDvTAHGX.net]
>>667
CTMCP(ガウディ本)読んで、計算モデル理解した方が良いよ。

685 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 06:56:36.26 ID:ReU+9sFg.net]
>>668
理解したよ。それでいいたことは何かな?

686 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 06:59:39.65 ID:Bq/cKCjD.net]
わお。まるで俺が返信したみたい。

まぁ俺も同じことを聞こうか
>>668
それで言いたいことはなにかな?

687 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 07:33:00.36 ID:zGjt7Ia9.net]
>>657
おま、戻り値を使いまわしたら基本的に再帰じゃないの?。。。

688 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 07:42:48.23 ID:Bq/cKCjD.net]
うわー
馬鹿しかいねぇ

689 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 07:45:22.49 ID:Bq/cKCjD.net]
失礼。すまなんだ。よけいな発言だった

690 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 08:00:20.87 ID:zGjt7Ia9.net]
//r:ret,s:diff,n:n
int sigma(int r, int s, int n) {
 if (n < 1)return 0;
 if (n == 1) return r;
 return r + sigma(r + s, s, n - 1);
}
int sigma2(int s, int n) {
 if (n < 1)return 0;
 int r = 0, t = s;
 for (n--; 0 < n; n--, t += s) r = r + t;
 return r;
}
戻り値の使いまわしは基本的に再帰



691 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 08:50:03.58 ID:Bq/cKCjD.net]
そこで再帰かどうかは決まらないんだけど。


でもあえてそこで決めるのならば(その話に乗るのならば)、手順 (もしくはそれに相当するもの) を覚えている物が再帰。
sum = sum + i;
これは現在の状態しか保持しない。

構造を検索するもの、…例えばディレクトリとファイル検索で
whileだけを使ったとしても、
出てきたそれぞれのファイル対し、そのアドレスを記録したら、
それは処理における必要資源量の理論最低値は再帰と等価

692 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 08:53:27.64 ID:zGjt7Ia9.net]
そそ、戻り値の使いまわしとスタック保存

693 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 08:59:50.82 ID:zGjt7Ia9.net]
たとえば、シュミレーションゲームでユニットの移動範囲を調べる
とかの全検索は、どうやっても再帰
もちろんA*も再帰

694 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 09:02:33.33 ID:Bq/cKCjD.net]
会話が成り立ってねぇ

695 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 09:03:26.20 ID:zGjt7Ia9.net]
スタック保存の必要がなければループ文でいい

696 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 09:05:10.34 ID:zGjt7Ia9.net]
>手順 (もしくはそれに相当するもの) を覚えている物が再帰。
これがスコープのスタック保存だろ

697 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 09:06:13.64 ID:Bq/cKCjD.net]
あんた
for(int i = 1; i <= 10; i++) {
 sum = sum + i;
}
これを再帰って言ったでしょうに。
これはスタックの保存じゃなくて上書きっつーの

698 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 09:13:54.31 ID:SH0QgRhI.net]
sum=sum+iで
sum+iのsumはスタック保存

699 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 09:20:33.46 ID:SH0QgRhI.net]
まあスタックを「戻す必要がないから」保存して上書きしてるんだろ

700 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 09:21:52.97 ID:Bq/cKCjD.net]
それはスタックじゃねぇ

a = 0;
a = a + 1;
a = a + 2;
以上の三行は再帰とは呼ばない

再帰と言うのは最終段階の55の瞬間に今までの経緯を覚えてて
そこで初めて再帰と必要資源量の (理論最低値の) 釣り合いが取れます。
例えば配列に 1, 2, 4, 7, 11,… と記録したらそこで初めてある側面で再帰と同じ資源量



701 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 09:25:47.84 ID:Bq/cKCjD.net]
いや再帰っつーのは終わるまで必ず自身がどの手順でそこの処理に居るのかが記録されてるから。
必要がないもくそもない

702 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 09:26:38.87 ID:zGjt7Ia9.net]
sum=sum+iで
sum+iのsumはスタック保存値
sum=のsumがスタック保存(+上書き)
こういうのはループでも全然いいけど
スコープスタックを保存する必要があるなら、完全に再帰しかない

703 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 09:29:04.79 ID:Bq/cKCjD.net]
さいならー

704 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 09:40:47.32 ID:zGjt7Ia9.net]
いや再帰っつーのは終わるまで必ず自身がどの手順でそこの処理に居るのかが記録されてるから。
必要がないもくそもない

だから、スコープスタックを保存する必要がある時に、再帰を使う必要があるんですってば

705 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 09:57:57.73 ID:zGjt7Ia9.net]
>>651

>>674
な感じなんだろ

ループは、スコープスタックを保存しなくていい時
再帰は、スコープスタックを保存しなければいけない時
再帰の文字通り、手順の戻り道を、覚えている必要があるかどうかだよ

706 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 10:00:34.66 ID:ReU+9sFg.net]
えー、バカ以外には言うまでもないことだが
スタックというものは、
値のプッシュ(スタックに積む)と
値のポップ(スタックから取り出す)を
行うためのデータ構造です。

これをしていないものは、当然
スタックではありません。

707 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 10:01:42.56 ID:zGjt7Ia9.net]
バカは知りませんが関数呼び出しはコールスタックです

708 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 10:01:59.54 ID:ReU+9sFg.net]
https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF

スタックはコンピュータで用いられる基本的なデータ構造の1つで、
データを後入れ先出し(LIFO: Last In First Out; FILO: First In Last Out)の構造で
保持するものである。抽象データ型としてのそれを指すこともあれば、その具象を指すこともある。

709 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 10:02:49.88 ID:ReU+9sFg.net]
>>691
> バカは知りませんが関数呼び出しはコールスタックです

どこの話をしてるんですか?

710 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 10:03:52.96 ID:ReU+9sFg.net]
再帰というのは、関数の中で
自分自身の関数を呼び出すもののことです。

これをやっていないものは
当然再帰ではありません



711 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 10:12:58.37 ID:zGjt7Ia9.net]
//r:ret,s:diff,n:n
int sigma(int r, int s, int n) {
 if (n < 1)return 0;
 if (n == 1) return r;
 return r + sigma(r + s, s, n - 1);
}
これは全部、スタックに保存されてるよ
だから、
int sigma2(int s, int n) {
 if (n < 1)return 0;
 int r = 0, t = s;
 for (n--; 0 < n; n--, t += s) r = r + t;
 return r;
}
これに比べて、スタック保存分、オーバーロードしているけどね
ユニットの移動範囲とか、画像のフィリングとか、
ある点の周囲探索は、スタック保存の再帰関数にするのが一番いいだろ

712 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 10:16:27.86 ID:zGjt7Ia9.net]
たとえば白黒ドットの囲まれた場所のある点からの塗りつぶしで
ループだけしか使わないバカがいるのか?

713 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 10:19:30.35 ID:Bq/cKCjD.net]
な、
会話するの難しいだろ

714 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 10:21:37.41 ID:ReU+9sFg.net]
>>695
お前は知らないだろうけどね。
関数ないのローカル変数っていうのは
全部スタックに保存されるんだよ。

スタックにデータを保存すれば
再帰という理屈であれば、
ローカル変数がある関数はすべて
再帰ってことになってしまう。

もちろんそんなことはありえない。

715 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 10:21:49.47 ID:zGjt7Ia9.net]
白黒ドットの囲まれた場所のある点からの塗りつぶしで
ループだけしか使わないで作れるなら作ってみろよ
ニヤニヤしながら見ててやるから

716 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 10:26:03.39 ID:zGjt7Ia9.net]
>>698
え?コールスタックが再帰じゃないの?
それじゃ、関数を呼び出した後、元の位置に戻れないぞ

717 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 10:26:17.15 ID:ReU+9sFg.net]
>>699
閉空間の塗りつぶしだね?
検索したあったよ。
もちろん再帰は使っていない

> この改良版アルゴリズムはスキャンライン・シード・フィル アルゴリズム(Scanline Seed Fill Algorithm)と呼ばれています。
fussy.web.fc2.com/algo/algo3-1.htm

718 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 10:27:24.93 ID:ReU+9sFg.net]
>>700
> え?コールスタックが再帰じゃないの?

ぷぷぷ。こいつマジでわかってなかったんだw
お前理屈だと、すべての関数呼び出しが再帰ってことになってしまう。
再帰は、関数が自分自身の関数を呼び出している場合のみ。
お前が言ってるのは、単なる関数呼び出しだ。

719 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 10:34:15.27 ID:zGjt7Ia9.net]
サブルーチンの呼び出しの後、
呼び出し元に復元(リターン)できなければ、
プログラムじゃねえよ

720 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 10:36:14.02 ID:ReU+9sFg.net]
ほらほら、こいつ再帰って言わなくなりましたよw
自分が言っていたことが間違っていたことがわかったから
恥ずかしくなった



721 名前:んでしょうねw []
[ここ壊れてます]

722 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 10:46:29.34 ID:SH0QgRhI.net]
コールスタックって再帰だよ
関数が元に戻れてスタック内容も変わらない
コールスタックを実装したら、当然再帰関数呼び出しも実装したことになる

723 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 10:47:55.97 ID:ReU+9sFg.net]
コールスタックがない関数はないから
すべての関数は再帰である。

>>705はそう言っているのです。
生暖かい目で見てあげましょう。


お兄ちゃん!関数使えるようになった!
私、再帰使いこなしてる!

724 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 11:00:37.95 ID:zGjt7Ia9.net]
ttp://nas6.main.jp/secret/ContainerPtr.htm

ttp://nas6.main.jp/NAS6_tree_clct.h
//再帰構文例1
//再帰構文例2
は俺は両方再帰だと思って作ったけどな
>>701
みたいのは
//再帰構文例1
の構造だろ

725 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 11:05:54.33 ID:zGjt7Ia9.net]
関数の自分自身を呼ばないと再帰関数じゃないっていうのは
頭が固いんじゃないの?

726 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 11:10:08.71 ID:zGjt7Ia9.net]
訂正
関数の自分自身を呼ばないと再帰処理じゃないっていうのは
頭が固いんじゃないの?
//再帰構文例1
は関数の自分自身を呼んでないけど、どう見ても再帰処理

727 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 11:23:13.73 ID:Bq/cKCjD.net]
いっぱい突っ込みどころがあるけどそれは置いといて、
今ひとつピンと来たものがある。

よくよく思い出すと「再帰処理」と「再帰関数」と言う似てるけど別の概念がある。
それを失念していた。

なおスレタイは再帰関数である。

728 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 11:27:58.33 ID:SH0QgRhI.net]

コールスタックは再帰処理だよ

729 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 11:34:56.98 ID:Bq/cKCjD.net]
だよ、じゃねぇよ
100のうち俺の失念であろう1だ
会話が成り立ってなさすぎるからどうでもいいんだが


>コールスタックを実装したら、当然再帰関数呼び出しも実装したことになる

730 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 11:38:41.59 ID:IJjvRwCO.net]
>>707
//再帰構文例2
> は俺は両方再帰だと思って作ったけどな

お前が間違ってるんだからお前が書いたコードきて
これが再帰なんだとか主張しても意味が無い。



731 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 11:42:04.89 ID:IJjvRwCO.net]
https://ja.wikipedia.org/wiki/%E5%86%8D%E5%B8%B0

再帰(さいき)とは、あるものについて記述する際に、記述しているもの
それ自身への参照が、その記述中にあらわれることをいう。
定義において、再帰があらわれているものを再帰的定義という。


なるほどね。自分自身への参照が必須なんだ。

732 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 11:55:26.05 ID:zGjt7Ia9.net]
>>714
だからクラスの関数呼び出しなんて、ほとんど
this->が省略されているだけなんだが・・・

733 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 11:57:10.38 ID:IJjvRwCO.net]
>>715
関係ないよ。

734 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 12:03:39.85 ID:9u1zKCQd.net]
>>708
頭が固いもなにも、それが再帰関数の定義なんだが…

735 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 12:09:24.27 ID:zGjt7Ia9.net]
アセンブリレベルが分からないと説明しようがないな
基本的にスタックでしか動かないし

ttp://www.math.kobe-u.ac.jp/~taka/asir-book-html/main/node65.html
再帰呼び出し、スタック

736 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 12:13:43.89 ID:zGjt7Ia9.net]
>>718の大学教授にこれはループであって再帰ではないってかみついてこいよ
def xn2(N) {
 XN = 0;
 for (I=0; I<N; I++) {
  XN = 2*XN+1;
 }
 return(XN);
}

737 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 12:25:42.76 ID:zGjt7Ia9.net]
int sum = 0;
 for(int i = 1; i <= 10; i++) {
  sum = sum + i;
}

な、これは再帰だろ、頭が悪いんだから、教授に迷惑をかけるなよ

738 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 12:44:51.30 ID:zGjt7Ia9.net]
戻り値を使いまわしたら基本的に再帰なんだよってはじめに書いておいた

739 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 12:56:18.37 ID:zGjt7Ia9.net]
>>701
のも

新たなシードを決める際には、バッファ中のどのピクセルを選んでもよいのですが、
新しい順か、古い順かのどちらかに統一するのが普通でしょう。
バッファをスタック構造にすれば新しい順、キューにすれば古い順に自然に決まります。

これを読んでいないのか再帰じゃないと思ってるんだろ

740 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 13:11:58.86 ID:IJjvRwCO.net]
> 戻り値を使いまわしたら基本的に再帰なんだよってはじめに書いておいた
違う



741 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 13:14:58.05 ID:zGjt7Ia9.net]
>>723
だから、戻り値を使って再帰呼び出ししているのと同じ事だろ

742 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 13:16:02.36 ID:a9 ]
[ここ壊れてます]

743 名前:CPEVg5.net mailto: >>721
戻り値を使い回すのはDP(動的計画法)という立派な名前が付いてるんだが
[]
[ここ壊れてます]

744 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 13:16:18.51 ID:IJjvRwCO.net]
例が良かったなw
すぐに見つかった。

>>720をアセンブリレベルにすると
見ての通りスタックも関数呼び出しもない。
単なるループ

mm.ahs.kitasato-u.ac.jp/~lm00000/sim/ueyama_ip/software/add10asm.html

次の例は 1 から 10 まで (実は 10 から 1 まで) の整数を加算するプログラムです。

ラベル  命令コード  オペランド  コメント文
     LD     B, 10     ; レジスタ B に 10 を代入する
     LD     A, 0     ; レジスタ A に 0 を代入する
LOOP: ADD    A, B     ; A に B を加える。加算結果はレジスタ A に。
     DEC    B       ; B の値から 1 を引く
     JR     NZ, LOOP   ; 引いた結果が 0 でなければ LOOP に分岐する
STOP: JR     STOP     ;プログラム終了。 加算結果はレジスタ A に残る。

745 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 13:16:42.20 ID:IJjvRwCO.net]
>>724
ぜんぜん違う

746 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 13:22:00.75 ID:zGjt7Ia9.net]
>>726

>>718
のリンクで
正式には再帰で書くけど、
最適化してループで書くってようなことが書いてあるだろ

747 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 13:26:52.77 ID:zGjt7Ia9.net]
>>718
のリンクでも
>>695
でも
>これに比べて、スタック保存分、オーバーロードしているけどね
こういうわけで再帰をループに最適化するわけ

748 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 13:34:34.79 ID:a9CPEVg5.net]
>>729
ねえ、そろそろ無知を晒すのやめない?恥ずかしくないか?

749 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 13:41:26.99 ID:zGjt7Ia9.net]
//等差数列
//定義に忠実に書いた場合
//r:ret,s:diff,n:n
int sigma(int r, int s, int n) {
 if (n < 1)return 0;
 if (n == 1) return r;
 return r + sigma(r + s, s, n - 1);
}
//メモリ使用量を最適化した場合
int sigma2(int s, int n) {
 if (n < 1)return 0;
 int r = 0, t = s;
 for (n--; 0 < n; n--, t += s) r = r + t;
 return r;
}
で、最適化されたのしか、教わらないし、理解できないのかな?

750 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 13:48:39.57 ID:zGjt7Ia9.net]
訂正

//等差数列
//定義に忠実に書いた場合
//r:ret,s:diff,n:n
int sigma(int r, int s, int n) {
 if (n < 1)return 0;
 if (n == 1) return r;
 return r + sigma(r + s, s, n - 1);
}
//メモリ使用量を最適化した場合
int sigma2(int s, int n) {
 if (n < 1)return 0;
 int r = 0, t = s;
 for (; 1 < n; n--, t += s) r = r + t;
 return r;
}



751 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 14:03:25.65 ID:SH0QgRhI.net]
sigma2は最適化された動的計画法
sigmaは「漸化式」の定義に基づいた再帰法

752 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 14:09:21.37 ID:zGjt7Ia9.net]
漸化式で求めた全ての項を
参照する必要があるのならば
動的計画法を用いることはできない

753 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 14:18:04.33 ID:bMqKfWg+.net]
>>733
codepad.org/pUWGRddj
どこを見れば等差数列だと分かるようになるのでしょうか?

754 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 14:20:40.72 ID:IJjvRwCO.net]
>>728
> 正式には「再帰で書くけど 最適化して(再帰ではなく)ループで書く」

ですね!?

最適化してループで書いたのだから
それは再帰ではないということです。

755 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 14:42:48.35 ID:zGjt7Ia9.net]
>>735
ああ、ごめんね
sigmaだから1〜nまでの等差数列の和だよ

漸化式の全ての項を使う
→全てのノードを使う時は動的計画法で最適化できないんよ
そのケースは、ある点からの周囲の経路を探索する場合
ディレクトリ探索だったり、塗りつぶしだったり、つまり全検索をかける場合
こういうのは再帰を使うだろうに

756 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 14:44:53.85 ID:zGjt7Ia9.net]
つまり経路の全検索をかける場合
こういうのは再帰を使うだろうに

757 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 14:56:44.42 ID:IJjvRwCO.net]
あれ? 根本的な前提わかってないの?

誰も再帰を絶対に使わないで書けとか言ってなくて、
ループで簡単にかけるようなものを
わざわざ再帰で書くなよ(笑)って
話なんだけど。

758 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 14:57:36.94 ID:zGjt7Ia9.net]
>>735
sigmaだから1〜n-1までの等差s数列の和
s=3なら
sigma=3+6+9+12+・・・

759 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 15:08:23.80 ID:zGjt7Ia9.net]
//1〜n-1までの等差s数列の和
//定義に忠実に書いた場合
//r:ret,s:diff,n:n
int sigma(int r, int s, int n) {
 if (n < 1)return 0;
 if (n == 1) return r;
 return r + sigma(r + s, s, n - 1);
}
//メモリ使用量を最適化した場合
int sigma2(int s, int n) {
 if (n < 1)return 0;
 int r = 0, t = s;
 for (; 1 < n; n--, t += s) r = r + t;
 return r;
}
べつにどっちで書けって言われても
項をスタックするかしないだけの違いだけど?

760 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 15:10:18.45 ID:IJjvRwCO.net]
> 項をスタックするかしないだけの違いだけど?

それよりも重要な違いは、
自分の関数自身を呼ぶかどうかだよ。

自分自身を呼ぶのが再帰、
そうでないのは再帰じゃない。



761 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 15:16:46.56 ID:dKM7sd/0.net]
その定義だと相互再帰は再帰じゃないのかと重箱の隅をつつかれるけど、間違いじゃない。

クソコ

762 名前:テは速やかにNG入れるといいよ。ラーメンが好きかどうかの話をしている中でお茶漬けもラーメンだと強弁するような、話題に入ることができない人だから。 []
[ここ壊れてます]

763 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 15:18:48.81 ID:ygimYbNM.net]
末尾再帰にあらずんば再帰にあらず

764 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 15:19:27.30 ID:zGjt7Ia9.net]
利点と欠点があって

再帰:書けない漸化式はない、項をスタックするからメモリを消費する
ループ:項の参照が少ない漸化式のみ書ける、項をスタックしないからメモリ使用量は少ない

そんだけ

765 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 15:23:23.93 ID:ygimYbNM.net]
>>745
ループと再帰は厳密に完全互換ですよ

766 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 15:31:56.99 ID:zGjt7Ia9.net]
>>746
ノード検索とか再帰のノード全てメモしてループするとか
素直に再帰を使っちゃいかんのかいな

767 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 15:35:58.97 ID:ygimYbNM.net]
>>747
可否の話をしただけ

>>745で可能性に対する言及が間違っているから、それを指摘したにすぎない
forでかけるものは、再帰でもかけるし
再帰でかけるものは、forでもかける

768 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 15:38:08.67 ID:1TQgpEDy.net]
うわーこいつ最悪だな
自分がほんまモンの馬鹿であるという自覚が全くないバカ
ま、見てる分には面白いけど他人に迷惑掛けんなよ
他人に迷惑を掛けるとなんとかキューゼットとかいう奴みたいに嫌われ者になっぞ

769 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 15:42:58.31 ID:gAQxPGKS.net]
NAS6って宗教板で「重力が神」みたいなことをホザいてた奴だな

770 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 18:40:37.54 ID:zGjt7Ia9.net]
利点と欠点があって

再帰:書けない漸化式はない
項をスタックするからメモリを消費する

ループ:項の参照が少ない漸化式のみ書ける
あるいは項をメモする必要がある
項をスタックしないからメモリ使用量は少ない

そんだけ



771 名前:デフォルトの名無しさん [2015/09/05(土) 19:01:21.79 ID:tTlkULNN.net]
>>751
スタックしない再帰があれば最強じゃん

772 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 19:32:52.27 ID:6bqI6s7I.net]
再帰処理と、再帰関数や再帰呼出とをきちんと区別しろ。

ループは再帰処理の一種だ。

773 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 19:37:09.10 ID:Bq/cKCjD.net]
まず定義に逆らうのやめろよ。
再帰は自己よ呼び出す関数だ。当然実行中の処理手順は無条件にスタックされる。

そして都合よく「再帰」と「ループ」を分けて見たり、全部再帰と言って見たり挙動不審なことをするのもやめれよ。
もはや会話が成り立たん。

ちなみに俺の場合は、一番最初の冒頭のレスで「極論的には再帰もループも同じ」
とした上で、その後は一貫して再帰とループを区別してんだよ。

すなわちCの状態のように関数とスタックの抽象化が出来てる状態で初めてループと再帰があるんだ。


君がやってることは犬小屋も本棚もどっちも「木」で出来てるから同じと言って見たり、
犬小屋と本棚は別物のように書いて見たり、
木の状態を指してこれは「犬小屋」と言って見たり、
「本棚」を指して「犬小屋」と言って見たり、
そもそもなんの話をしてるか分からなくなって見たり。

774 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 19:40:47.01 ID:CMLBJgqr.net]
schemeのnamed letは繰り返し? 再帰?

775 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 20:00:58.23 ID:zGjt7Ia9.net]
double calcPI(double r, double s, double n) {
 double t = 1.0;
 if (s == 1) t = 2.0;
 if (n == 1) return r;
 return t * (r + calcPI(r * s / (2.0 * s + 1.0), s + 1, n - 1));
}
double calcPI2() {
 double sse = 0.00000000000001; double a = 0.125;
 double b = sqrt(a); double c = 1.0 + 3.0 * b;
 double d = sqrt(c); double e = 0.625;
 double f = d - e; d = 2 * d;
 b = f - b; c = c + f;
 double npow = 4;
 do {
  npow = 2 * npow;  f = (c + d) / 2;
  d = sqrt(c * d);  f = f - d;
  d = 2 * d;  b = b - f;  c = f + d;
 } while (sse < f);
 f = f * f / 4; c = c + d;
 return (c * c - f - f / 2) / (c * b - f) / npow;
}
どっちが簡単だと思う?

776 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 20:25:21.94 ID:zGjt7Ia9.net]
double calcPI(double r, double s, double n) {
 double t = 1.0;
 if (s == 1) t = 2.0;
 if (n == 1) return r;
 return t * (r + calcPI(r * s / (2.0 * s + 1.0), s + 1, n - 1));
}
double calcPI3(double n) {
 double r = 1.0;
 double s = 1.0;
 double t = 1.0;
 while (1 < n) {
  t = (t * s / (2.0 * s + 1.0));
  r = r + t;
  s += 1;
  n -= 1;
 }
 return 2.0 * r;
}
意地悪が過ぎたが、今度はマジ
どっちが可読性があるの?

777 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 20:34:20.88 ID:zGjt7Ia9.net]
ああ、ちなみにπの漸化式は
2(1+(1/3)+(1/3)(2/5)+(1/3)(2/5)(3/7)+...)
だからね

778 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 20:49:22.97 ID:zGjt7Ia9.net]
変数名がごっちゃにならないように書き直し
double calcPI(double r, double s, double n) {
 double u = 1.0;
 if (s == 1) u = 2.0;
 if (n == 1) return r;
 return u * (r + calcPI(r * s / (2.0 * s + 1.0), s + 1, n - 1));
}
double calcPI3(double n) {
 double r = 1.0;
 double s = 1.0;
 double t = 1.0;
 double u = 2.0;
 while (1 < n) {
  t = (t * s / (2.0 * s + 1.0));
  r = r + t;
  s += 1;
  n -= 1;
 }
 return u * r;
}

779 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 21:09:08.26 ID:zGjt7Ia9.net]
完全に同じ処理にしたけど、どっちが楽なんだろうね?
double calcPI(double r, double s, double n) {
 double u = 1.0;
 if (s == 1) u = 2.0;
 if (n == 0) return r;
 return u * (r + calcPI(r * s / (2.0 * s + 1.0), s + 1, n - 1));
}
double calcPI3(double n) {
 double r = 1.0;
 double s = 1.0;
 double t = 1.0;
 double u = 1.0;
 while (0 < n) {
  t = t * s / (2.0 * s + 1.0);
  r = u * (r + t);
  s += 1;
  n -= 1;
 }
 u = 2.0;
 return u * r;
}

780 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 21:16:59.43 ID:zGjt7Ia9.net]
我々は「軍国主義者」を打倒したと、我らが「軍事パレード」で宣言



781 名前:デフォルトの名無しさん [2015/09/05(土) 21:27:52.93 ID:tTlkULNN.net]
>>761
Javaできる?
Javaで2つのint型配列を結合する処理を再帰で書いてみて

782 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 21:55:59.06 ID:zGjt7Ia9.net]
コンパイラ入れんのめんどくさいからパス
#include <iostream>

void init(int * p, int n) {
 for (; 0 < n; n--) p[n] = 0;
}
void disp(int * p, int n) {
 std::cout << std::endl;
 for (int i = 0; i < n; i++) std::cout << p[i] << " ";
 std::cout << std::endl;
}
int recUnit(int i, int j, int *a, int na, int *b, int nb) {
 if (i < na && j < nb) a[i] = b[j];
 else return i;
 return recUnit(i + 1, j + 1, a, na, b, nb);
}
void unit(int *a, int na, int *b, int nb, int *c, int nc) {
 int i;
 i = recUnit(0, 0, a, na, b, nb);
 recUnit(i, 0, a, na, c, nc);
}

783 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 21:56:37.35 ID:zGjt7Ia9.net]
void unit2(int *a, int na, int *b, int nb, int *c, int nc) {
 int i, j;
 for (i = 0, j = 0; j < nb; i++, j++) if (i < na)a[i] = b[j];
 for (j = 0; j < nc; i++, j++) if (i < na)a[i] = c[j];
}
int main()
{
 int a[10], b[5] = { 0, 1, 2, 3, 4 }, c[5] = { 5, 6, 7, 8, 9 };
 init(a, 10); unit(a, 10, b, 5, c, 5); disp(a, 10);
 init(a, 10); unit2(a, 10, b, 5, c, 5); disp(a, 10);
 return 0;
}

784 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 22:03:28.78 ID:zGjt7Ia9.net]
ミスった
#include <iostream>

void init(int * p, int n) {
 for (; 0 < n; n--) p[n - 1] = 0;
}
void disp(int * p, int n) {
 std::cout << std::endl;
 for (int i = 0; i < n; i++) std::cout << p[i] << " ";
 std::cout << std::endl;
}
int recUnit(int i, int j, int *a, int na, int *b, int nb) {
 if (i < na && j < nb) a[i] = b[j];
 else return i;
 return recUnit(i + 1, j + 1, a, na, b, nb);
}
void unit(int *a, int na, int *b, int nb, int *c, int nc) {
 int i;
 i = recUnit(0, 0, a, na, b, nb);
 recUnit(i, 0, a, na, c, nc);
}

785 名前:デフォルトの名無しさん [2015/09/05(土) 22:07:56.87 ID:tTlkULNN.net]
>>765
    ∩____∩
   /       \
  ./   ●   ●  .', C++やねー ありがとー
  l     ( _●_)    l
 彡、    |∪|    ミ
 i"./   ヽノ    ',ヽ
 ヽi          iノ
  ',         /
   ヽ    /   /
    ',   i!  /
   (___/ \___)

786 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 22:24:32.63 ID:zGjt7Ia9.net]
ちゃんと出来てるかこっちのほうがいいか
void unit2(int *a, int na, int *b, int nb, int *c, int nc) {
 int i, j;
 for (i = 0, j = 0; j < nb; i++, j++) if (i < na) a[i] = b[j];
 for (j = 0; j < nc; i++, j++) if (i < na) a[i] = c[j];
}
int main()
{
 int a[10], b[4] = { 0, 1, 2, 3 }, c[6] = { 4, 5, 6, 7, 8, 9 };
 init(a, 10); unit(a, 10, b, 4, c, 6); disp(a, 10);
 init(a, 10); unit2(a, 10, b, 4, c, 6); disp(a, 10);
 return 0;
}

787 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 22:31:18.83 ID:zGjt7Ia9.net]
最適化されているのはループで
漸化式定義に忠実で書きやすいのが再帰だよ

788 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 22:33:05.45 ID:zGjt7Ia9.net]
>>758
>>760
>>768

789 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 22:47:45.27 ID:zGjt7Ia9.net]
void recForFunc() { ; }
int recFor(int i, int n, int a) {
 if (n <= i) return i;
 recForFunc();
 return recFor(i + a, n, a);
}


std::cout << recFor(0, 10, 2) << std::endl;

for (i = 0; i < 10; i += 2) recForFunc();
std::cout << i << std::endl;

ループと再帰の違いは
スコープスタックを保存しているかしていないかだけ

790 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 22:57:11.75 ID:zGjt7Ia9.net]
recForはint i = 0,2,4,6,8,10をpushしてpopしながら戻ってくる
forはpopしながら戻る機能はない



791 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 22:59:40.11 ID:IJjvRwCO.net]
ループと再帰の違いは
自分の関数自身を呼び出しているかだけ。

反論あるならどうぞ?

792 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 23:03:39.21 ID:zGjt7Ia9.net]
int recFor(int i, int n, int a) {
 if (n <= i) return i;
//pushしたiを使う時はここに処理
 recForFunc();
 i = recFor(i + a, n, a);
//popしたiを使う時はここに処理
 return i;
}

793 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 23:14:34.40 ID:SH0QgRhI.net]
>>772
めっちゃ適当に書くけどこれも再帰



794 名前:class A{
public:
 A* func(){...return this;}
};

A* crnt;
while(true){
 crnt = crnt->func();
//crntへの再帰処理&NEXT処理
}
[]
[ここ壊れてます]

795 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 23:19:20.41 ID:zGjt7Ia9.net]
ttp://nas6.main.jp/secret/ContainerPtr.htm
ttp://nas6.main.jp/sptr.cpp
ttp://nas6.main.jp/NAS6_cntn_ptr.h
ttp://nas6.main.jp/NAS6_tree_clct.h
実例は↑の
//再帰構文例1
//再帰構文例2
とか

796 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 23:24:29.51 ID:zGjt7Ia9.net]
//再帰構文例1
みたいに書くのがノード検索を
なんも考えないで書ける

797 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 23:30:27.24 ID:htzS6HST.net]
>>774
それに近いコードを
「再帰」だって主張している
ページを見つけてきてね(大爆笑)

798 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 23:32:10.40 ID:htzS6HST.net]
当たり前だけど>>774
funcの中でfuncを呼び出していないから
再帰ではない。

799 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 23:36:14.88 ID:zGjt7Ia9.net]
ttp://nas6.main.jp/sptr.cpp

template<typename T>
void disp_NAS6_tree_clct(NAS6_tree_clct<T>* root);
template<typename T>
void disp_NAS6_tree_clct_key(NAS6_tree_clct<T>* root, string fk);
とか、ノード検索をなんも考えないでノード検索が出来ちゃう

800 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 23:38:50.80 ID:zGjt7Ia9.net]
>>777
ttp://msdn.microsoft.com/ja-jp/library/Cc429242.aspx
win32api
FindNextFile()



801 名前:デフォルトの名無しさん [2015/09/05(土) 23:38:57.11 ID:tTlkULNN.net]
再帰構造をループで処理することを再帰処理と言うてんの?

802 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 23:40:03.04 ID:htzS6HST.net]
>>780
「再帰」って書いてないね。
やっぱり再帰じゃなかったね。
逆の証拠を見つけてくれてあがとう(大爆笑)

803 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 23:41:35.40 ID:htzS6HST.net]
>>781
アホのオレオレ定義だよなぁ(大爆笑)

804 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 23:45:35.82 ID:zGjt7Ia9.net]
ttp://www.google.co.jp/?gws_rd=ssl#q=findnextfile%20%E5%86%8D%E5%B8%B0
FindNextFile 再帰

805 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 23:48:34.61 ID:htzS6HST.net]
>>784
お前がググって
自分で証拠を見つけ出すんだよ(大爆笑)

自分の仕事を(出来ないからって)
他人にやらせるな。

806 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 23:51:11.81 ID:zGjt7Ia9.net]
>>785
>>784
の検索結果のほぼ全て

807 名前:デフォルトの名無しさん [2015/09/05(土) 23:53:43.47 ID:tTlkULNN.net]
>>783
うむ、再帰構造と再帰処理を混同しておられるとしか思えぬ。

808 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 23:54:28.66 ID:htzS6HST.net]
>>786
言葉が足りないぞ?(大爆笑)

>>785
>>784
の検索結果のほぼ全てに
FindNextFileを使って再帰を使ったコードが有ります。
再帰というのは自分の関数自身を呼び出すものなので、
大概そのようになっています。

つまり、検索の一番目だと、このコメントの部分が再帰です。
(FindNextFileの行には再帰とは書いていない)

void searchDir(char *lpszDir,HWND hwLst) { /* サブディレクトリ探索 */
  省略
if ((fFind.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)!=0 &&
lstrcmp(fFind.cFileName,".")!=0 &&
lstrcmp(fFind.cFileName,"..")!=0){ /* サブディレクトリの処理 */
    省略
searchDir(lpszSDir,hwLst); /* 再帰呼び出し */
}

while (FindNextFile(hSearch,&fFind)) { /* 全ファイルを処理 */
     省略
searchDir(lpszSDir,hwLst);
}
}
FindClose(hSearch);
}

809 名前:NAS6 ◆n3AmnVhjwc [2015/09/05(土) 23:54:52.90 ID:zGjt7Ia9.net]
htzS6HST
お前あほ杉
なんも分かってないなら書き込むな

810 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 23:55:51.09 ID:htzS6HST.net]
>>789
わかってるから書き込んでいる。

これも「再帰」(大爆笑)



811 名前:デフォルトの名無しさん mailto:sage [2015/09/05(土) 23:57:07.95 ID:m0Ws+Wye.net]
話がループ・・・おっと違った
話が再帰してる(大爆笑)

812 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 00:00:00.32 ID:aj7iBxVG.net]
ループと再帰関数を同一だと主張するだけで(それすらオレオレ定義&根拠無し)その先のことを何も言わないのは何故?
「Xは再帰」「Yは再帰」「Zは再帰」って、いくらコードを書いても根拠にならないのは分かってる?
お前が書かなきゃならんことは「Xが再帰であることの根拠」であるのだから、お前の頭の中にしかない「再帰関数の定義」を書かないといけない。
もしオレオレ定義じゃないなら>>742>>714の再帰関数の定義に、お前の書くコードがどう当てはまるのか書かないといけない。

そんで結局NAS6 ◆n3AmnVhjwcの主張は何なの?再帰関数が好きなの嫌いなの?
スレ違いも大概にしなさいよ。

813 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 00:01:55.86 ID:8kAWPtv+.net]
NAS6 ◆n3AmnVhjwcの主張はこれ。

719 名前:NAS6 ◆n3AmnVhjwc [] 投稿日:2015/09/05(土) 12:25:42.76 ID:zGjt7Ia9 [22/59]
int sum = 0;
 for(int i = 1; i <= 10; i++) {
  sum = sum + i;
}

な、これは再帰だろ、頭が悪いんだから、教授に迷惑をかけるなよ

814 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 00:02:26.01 ID:miXQ60Mg.net]
>>788
そのsearchDirの書式を簡単にして

ttp://nas6.main.jp/sptr.cpp

template<typename T>
void disp_NAS6_tree_clct(NAS6_tree_clct<T>* root);
template<typename T>
void disp_NAS6_tree_clct_key(NAS6_tree_clct<T>* root, string fk);
とか、ノード検索をなんも考えないでノード検索が出来ちゃう

815 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 00:02:42.93 ID:8kAWPtv+.net]
ちなみに>>720は再帰じゃないから、
>>720を再帰で書き直すことができる

816 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 00:03:42.83 ID:8kAWPtv+.net]
>>794
今は再帰かどうかの話をしてるんだが?(大爆笑)

searchDir の中で searchDir を読んでるから再帰。
FindNextFileを使ってるもの全てが再帰になるわけじゃない。

817 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 00:07:36.08 ID:miXQ60Mg.net]
ttp://nas6.main.jp/secret/ContainerPtr.htm
これをコンソールアプリでビルドしてみ
ノード検索されてるから

で、forとかループに対応するものと言うから
再帰「関数」ではなく再帰「処理」を書いてる

818 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 00:09:15.40 ID:8kAWPtv+.net]
>>797
今は再帰の定義をしている。
全ての再帰はループで処理できる。

ループでノード検索しているから
それは再帰でない証拠(大爆笑)

ttp://nas6.main.jp/secret/ContainerPtr.htm
これをコンソールアプリでビルドしてみ
再帰使わずにノード検索できてるから

あ、ちなみに、このコードは俺が書いたんだよ?

819 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 00:13:16.02 ID:miXQ60Mg.net]
再帰「関数」だと、再帰「処理」内の、全てのコードを完全実装しなければならなくて
その振る舞いが決定されるから

ttp://nas6.main.jp/sptr.cpp

template<typename T>
void disp_NAS6_tree_clct(NAS6_tree_clct<T>* root);
template<typename T>
void disp_NAS6_tree_clct_key(NAS6_tree_clct<T>* root, string fk);

こう書いたんだよ

820 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 00:16:13.79 ID:miXQ60Mg.net]
>>798
なにこのカス



821 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 00:22:17.38 ID:miXQ60Mg.net]
>あ、ちなみに、このコードは俺が書いたんだよ?

じゃあ、デストラクタがどう呼ばれるか説明してみ
つうか、俺のサイトにお前がアップしたの?

822 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2015/09/06(日) 00:29:02.94 ID:0zNPIayW.net]
NAS6さん、華麗なる2ちゃんデビューおめ!

823 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 00:31:05.32 ID:CQ0buOj1.net]
ttp://nas6.main.jp/NAS6_tree_clct.h
数時間で↑のデストラクタの振る舞いが読めたら褒めちゃいます

824 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 00:48:13.59 ID:CQ0buOj1.net]
多分、どうなってるか
さっぱり分からんと思うけどね

825 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 01:09:59.10 ID:laHESI+6.net]
キチガイの思考過程がさっぱり分からないのは当然の事だろ

826 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 01:12:42.58 ID:miXQ60Mg.net]
//メモリリーク検出関数
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

メモリリークゼロ

827 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 01:15:51.45 ID:miXQ60Mg.net]
void main() {
int *p = new int;
#ifdef _MSC_VER

って書くと、int分4バイトだけリーク

828 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 01:32:13.72 ID:aj7iBxVG.net]
NAS6 ◆n3AmnVhjwcは再帰とは何かも含めて、言葉の定義を他と擦り合わせろ。
それができないなら自分のサイトに引きこもっていろ。

829 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 01:37:20.23 ID:miXQ60Mg.net]
俺は再帰「処理」を書いてるよ
再帰「関数」ならば、それで完結した書き方を
書かなきゃならなくて適宜運用に不向き

830 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 01:41:27.92 ID:aj7iBxVG.net]
なら何故ここにいるの?スレタイ読めないの?



831 名前:デフォルトの名無しさん [2015/09/06(日) 01:43:51.10 ID:Zg6i8dH9.net]
>>809
普通は再帰関数で行う処理のことを再帰処理って言うんだと思うよ。

832 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 01:48:22.86 ID:CQ0buOj1.net]
1 :名無しのプログラマ:2015/08/09(日) 17:46:33.69 ID:Icb40LOY
for,while使うの嫌いで基本的に再帰多用するんだが、だめなの?
皆から敬遠されてる気がする

for,whileって言うから、それに対応するものは
スレタイの再帰「関数」じゃなくて、再帰「処理」だからだよ

833 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 01:55:27.64 ID:CQ0buOj1.net]
ttp://ja.wikipedia.org/wiki/%E5%86%8D%E5%B8%B0%E7%9A%84%E5%A

834 名前:E%9A%E7%BE%A9
再帰的定義
[]
[ここ壊れてます]

835 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 01:56:17.98 ID:8PjODHJ7.net]
一人でそうゆうこと書いてて満足か?

836 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 02:08:49.81 ID:miXQ60Mg.net]
「再帰的定義: "再帰的定義"を参照」

//再帰構文例1
template<typename T>
void recHoge1(NAS6_tree_clct<T>* root, string fk) {
 bool parent = false;
 if (&root->recursiveInit() == nullptr) return;
 NAS6_tree_clct<T>* crnt = root;
 //crnt = root; の時のcrntに適用の処理
 //or : //if (crnt->conformkey(crnt, fk) != string::npos) //{...} //キー検索の時
 while (!crnt->recursiveIsEnd(root)) {

  //「再帰的定義: "再帰的定義"を参照」
  parent = false;
  crnt = &(crnt->recursiveNext(root), parent);
  //or : //crnt = &(crnt->recursiveKeyNext(root, fk, parent));


  //if(!parent) //{...} //crnt = Next; の時のcrntに適用の処理
  //else //{...} //親に戻った時の処理
 }
} 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)


837 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 02:14:12.46 ID:miXQ60Mg.net]
//「再帰的定義: "再帰的定義"を参照」
parent = false;
crnt = &(crnt->recursiveNext(root), parent);
//or : //crnt = &(crnt->recursiveKeyNext(root, fk, parent));

左辺のcrntは、右辺のcrntの子ノードに遷移してんの

838 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 02:17:05.47 ID:aj7iBxVG.net]
それが文脈が無駄に高いオレオレコードをコピペする理由になると思ったのはどうして?
>>720を再帰だ、などという戯言が通らなくて癇癪起こしているだけじゃないか。

で、>>813の定義に>>720がどう当てはまっているんだ?俺には分からない。
もしもsum = sum + iが再帰的定義なんだと思っているなら、それは単なる代入だから違うぞ。

839 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 02:20:56.64 ID:CQ0buOj1.net]
//or : //crnt = &(crnt->recursiveKeyNext(root, fk, parent));

ああ、こっちはキーの一致の次のノードで子とは限らんけど

再帰だからもちろん親のノードにも最下層まで行ってから帰ってくるよ

840 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 02:21:09.18 ID:8PjODHJ7.net]
君、途中で再帰関数と再帰処理の違いを指摘されてなかったか?
なんか無言で言ってることを切り替えてるようだけど。



841 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 02:24:47.62 ID:miXQ60Mg.net]
「再帰的定義: "再帰的定義"を参照」
f(n+1) = f(n) + i;
sum = sum + i;

842 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 02:26:17.85 ID:8PjODHJ7.net]
>>820 もっかい聞くけど楽しいか?

843 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 02:28:04.25 ID:CQ0buOj1.net]
めちゃくちゃ楽しい

844 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 02:32:22.07 ID:8PjODHJ7.net]
ちょっと自己顕示欲が強いんだね
ただそれは迷惑だからそのへんも考えれるようになればいいね

845 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 02:33:09.17 ID:CQ0buOj1.net]
「再帰的定義: "再帰的定義"を参照」
f(n+1) = f(n) + i;
sum = sum + i;

左辺はn+1項で、右辺はn項

846 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 02:40:59.21 ID:CQ0buOj1.net]
670 :NAS6 ◆n3AmnVhjwc :2015/09/05(土) 07:33:00.36 ID:zGjt7Ia9
>>657
おま、戻り値を使いまわしたら基本的に再帰じゃないの?。。。

最初に書きました
戻り値の使い回しは基本的にn+1項の定義

847 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 02:52:22.91 ID:CQ0buOj1.net]
厳密にするわ
「再帰的定義: "再帰的定義"を参照」
f(n+1) = f(n) + i;
sum = sum + i;

左辺はn+1項までの和で、右辺はn項までの和

848 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 02:53:55.79 ID:miXQ60Mg.net]
全然間違ってすらいないよ

849 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 03:05:39.93 ID:miXQ60Mg.net]
一体、他にどう読んでたんだよ?

850 名前:デフォルトの名無しさん [2015/09/06(日) 03:21:13.07 ID:Zg6i8dH9.net]
>>828
君は他の人が言う再帰をどう読んでたの?



851 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 03:21:47.38 ID:aj7iBxVG.net]
全然違うよ。右辺のsumはどこで定義したんだ?int sum = 0が定義。sum + iでただ更新してるだけ。
一方のfは、初期値も含めて正確に表せばf(n) = if n = 0 then 0 else f(n-1) + 1となっていて、fを定義するのにf自身が必要。
これが再帰的定義。

852 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 03:30:27.61 ID:miXQ60Mg.net]
おいおい、初項を決めないで再帰(帰納)定義ができるわけはないだろ

853 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 03:33:43.48 ID:CQ0buOj1.net]
おま、数学の帰納法も開始できないのか?

854 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 04:00:23.70 ID:g2 ]
[ここ壊れてます]

855 名前:NsvO1D.net mailto: ヒントってか答え
初項:f(n = 0) = 0

f(1) = 0 + i
f(2) = f(1) + i = i + i
f(3) = f(2) + i = 2 * i + i
...

f(n + 1) = f(n) + i
[]
[ここ壊れてます]

856 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 04:17:34.08 ID:aj7iBxVG.net]
sumを定義するのにsumを使っていないから駄目で、sum = sum + iは定義じゃなくて単なる更新だから再帰的定義ではない。
int sum = 0とした後にどう更新しようが再帰的とは呼ばないんだよ。

百歩譲ってこれを再帰的定義と呼ぶのなら、当てはまる例が多すぎて何の価値もない概念になる。i++も再帰になるし
int y = 1;
int x = 2;
x = y
としたら偶々x = x/2をという処理になるからこれもお前の言う再帰的定義になるよな。
そんな馬鹿なもんにわざわざ名前を付ける意味も無いし、好き嫌いも語れんよな。

857 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 04:18:39.27 ID:g2NsvO1D.net]
>>830
では、理系の学部を卒業するのは奇跡だろ

858 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 04:20:59.76 ID:CQ0buOj1.net]
つ漸化式

859 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 04:30:52.77 ID:CQ0buOj1.net]
もしかして
ゆとりって、そんなヒドイの?

860 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 04:34:02.41 ID:CQ0buOj1.net]
そんなわけはないと思いたい



861 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 04:39:58.28 ID:miXQ60Mg.net]
漸化式から再帰定義をコーディングするのは当たり前だろ?
学部で習わなかった?

862 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 04:45:55.83 ID:miXQ60Mg.net]
おかしいな
理系ならば情報処理の単位で
漸化式からの再帰定義は
カリキュラムに多分あるはずだけど?

863 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 04:54:07.46 ID:8PjODHJ7.net]
元々な、そんな話は誰一人としてしてないからね。
自信満々に書き込んでる内容自体が全部ずれてるからね。

で、仮にそれが再帰だとして言いたいことはなんだ?

864 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 04:55:04.91 ID:miXQ60Mg.net]
ttp://www.a.math.ryukoku.ac.jp/~junta/edu/nc/exercise/5.html
>>758
>>760

865 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 04:58:01.28 ID:CQ0buOj1.net]
>>842
みたいなのを自分でやらずに
コピペ提出したんだろ

866 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 05:05:14.35 ID:8PjODHJ7.net]
ベンチ取ってないけどCの場合だと速いのは下だろう

つーか再帰の定義を世間のプログラマと同じにしたらどうだ

867 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 05:25:54.12 ID:g2NsvO1D.net]
バグがあると見るなら訂正
double calcPI(double r, double s, double n) {
 double u = 1.0;
 if (s == 1) u = 2.0;
 if (n == 0) return u * ( r + (r * s / (2.0 * s + 1.0)));
 return u * (r + calcPI(r * s / (2.0 * s + 1.0), s + 1, n - 1));
}
double calcPI3(double n) {
 double r = 1.0;
 double s = 1.0;
 double t = 1.0;
 double u = 1.0;
 while (0 <= n) {
  t = t * s / (2.0 * s + 1.0);
  r = u * (r + t);
  s += 1;
  n -= 1;
 }
 u = 2.0;
 return u * r;
}

868 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 05:31:14.68 ID:CQ0buOj1.net]
ああ元のまんまかな
>>760

869 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 09:07:19.68 ID:8kAWPtv+.net]
>>834
> sumを定義するのにsumを使っていないから駄目で、sum = sum + iは定義じゃなくて単なる更新だから再帰的定義ではない。
> int sum = 0とした後にどう更新しようが再帰的とは呼ばないんだよ。

ホントその通り。
頭の悪さがにじみ出てるよねw

870 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 10:34:04.98 ID:DHZQ2m5W.net]
破壊代入を認めないというルールのもとではどうなるの?



871 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 11:30:18.37 ID:miXQ60Mg.net]
ヒントってか答え
初項:f(n = 0) = 0

f(1) = f(0) + i = 0 + i
f(2) = f(1) + i = i + i
f(3) = f(2) + i = 2 * i + i
...

f(n + 1) = f(n) + i

sum = sum + i

>>847
どう見ても漸化式通りの振る舞い

872 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 11:31:06.67 ID:8kAWPtv+.net]
再帰の定義を調べてみたら、
関数が自分自身の関数を
呼び出していることって書いてあった。

873 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 11:36:22.64 ID:miXQ60Mg.net]
あ、

ヒントってか答え
初項:f(n = 0) = 0 i(n = 0) = 1

i(n + 1) = i(n) + 1

f(1) = f(0) + i(0) = 0 + i(0)
f(2) = f(1) + i(1) = i(1) + i(0)
f(3) = f(2) + i(2) = i(1) + i(0) + i(2)
...

f(n + 1) = f(n) + i(n)

sum = sum + i

>>847
どう見ても漸化式通りの振る舞い

874 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 11:40:30.06 ID:8kAWPtv+.net]
再帰っていうのは、漸化式かどうかは関係なくて
関数が自分自身の関数を
呼び出していることらしいね。

875 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 11:54:16.59 ID:miXQ60Mg.net]
653 :デフォルトの名無しさん:2015/09/04(金) 23:24:17.87 ID:q06Od88z
n-1 までの和に n を足せば nまでの和が得られる、という原理に忠実な計算なんで
再帰以外のなにものでもないんだけど、基礎論触ったことないとわかんないかもね。

656 :デフォルトの名無しさん:2015/09/04(金) 23:29:28.63 ID:vuZU5Hwi
>>653
ループじゃんw

書けば理解できるのか?

int sum = 0;
for(int i = 1; i <= 10; i++) {
 sum = sum + i;
}

876 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 11:57:27.68 ID:miXQ60Mg.net]
初項:f(n = 0) = 0,i(n = 0) = 1

i(n + 1) = i(n) + 1

f(1) = f(0) + i(0) = 0 + i(0)
f(2) = f(1) + i(1) = i(1) + i(0)
f(3) = f(2) + i(2) = i(1) + i(0) + i(2)
...

f(n + 1) = f(n) + i(n)

↓が↑こういう

877 名前:漸化式になってるのが理解できないのか?

int sum = 0;
for(int i = 1; i <= 10; i++) {
 sum = sum + i;
}
[]
[ここ壊れてます]

878 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 12:02:33.74 ID:8kAWPtv+.net]
みんなわかってると思うけど、
誰も漸化式であることを否定していない。

漸化式をとく問題を
ループで書くか再帰で書くかって話をしている。

再帰で書くとスタックを消費する。
場合によってはスタックオーバーフローを起こす。

だからスタックオーバーフローを気にするならば
ループで書く。そして多くの場合ループのほうが速い。

という話をしている。

879 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 12:02:46.10 ID:CQ0buOj1.net]
初項:f(n = 0) = 0,i(n = 0) = 1

i(n + 1) = i(n) + 1

f(1) = f(0) + i(0) = 0 + 1
f(2) = f(1) + i(1) = i(1) + i(0)
f(3) = f(2) + i(2) = i(0) + i(1) + i(2)
...

f(n + 1) = f(n) + i(n)

↓が↑こういう漸化式になってるのが理解できないのか?

int sum = 0;
for(int i = 1; i <= 10; i++) {
 sum = sum + i;
}

880 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 12:04:50.09 ID:5yTvo1pN.net]
もうやめといてやれよ
NAS6は自分で新しい言葉を定義するのが好きな精神障害者だろ
こういうのは「言語新作」と言って統合失調症特有の症状

要するに脳内はドーパミンドハドバ出まくりで覚せい剤を決めてるような感じになってるわけだ
これは統合失調症の陽性症状
ただ統合失調症はそんなに甘くなく「バッドトリップ」、すなわち陰性症状もひどい
だから2chに書き込みしてない時は死にたくなってるんじゃね
これじゃまともな日常生活を送れるわけがない
廃人みたいな私生活なんだろうな

なんでム板には精神異常者が多いんだろうねえ



881 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 12:07:52.59 ID:8kAWPtv+.net]
コピペ始めちゃったしねw

コミュ障であることは明らか

882 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 12:09:07.82 ID:CQ0buOj1.net]
>>855
それは再帰の最適化だから
ループの再帰なんだけど?
再帰「関数」にせよ、ループ再帰にせよ
再帰(帰納)定義を実装しなければならない

883 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 12:13:50.10 ID:n7lw0XxH.net]
>>855
末尾再帰じゃないと再帰じゃないっつってんだろ

884 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 12:16:12.34 ID:CQ0buOj1.net]
初項:f(n = 0) = 0,i(n = 0) = 1

i(n + 1) = i(n) + 1

f(1) = f(0) + i(0) = 0 + 1
f(2) = f(1) + i(1) = i(1) + i(0)
f(3) = f(2) + i(2) = i(0) + i(1) + i(2)
...

f(n + 1) = f(n) + i(n)

↓が↑こういう漸化式になってるのが理解できないのか?

int sum = 0;
for(int i = 1; i <= 10; i++) {
 sum = sum + i;
}

それは再帰の最適化だから
ループの再帰なんだけど?
再帰「関数」にせよ、ループ再帰にせよ
再帰(帰納)定義を実装しなければならない

勝利 V(ブイ)!!

885 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 12:20:43.70 ID:miXQ60Mg.net]
>>860
おま、こうしか書けなくて
int hoge(){
 //処理
 return hoge();
}

こう書けないの?
int hage(){
 //再帰push処理
 int i = hage();
 //再帰pop処理
 return i;
}

886 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 12:25:45.01 ID:5yTvo1pN.net]
おくすり飲み忘れてるよNAS君
ハイの時間が長いほどローの時間が長くてひどいのは君が一番よく知ってるだろう

887 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 12:29:41.96 ID:miXQ60Mg.net]
ははは、論理で敵わないと、人格攻撃をして醜態をさらす

888 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 12:33:58.57 ID:8PjODHJ7.net]
>>864
こういっちゃなんだが、そう思ってるのは君だけだろう。
誰もがそれを逆に見てると思う。

889 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 12:36:27.22 ID:miXQ60Mg.net]
人格攻撃の書き込みが、書いた本人の醜態をさらしている以外のなんだと思うの?

890 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 12:37:41.03 ID:8PjODHJ7.net]
読むところはそこじゃないでしょ。
最初から読んだけど都合のいいことばっか書いたり読み飛ばしたり話変えたりってのが多いと思うよあなた



891 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 12:37:54.03 ID:miXQ60Mg.net]
>>865
>>861

892 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 12:39:49.40 ID:8PjODHJ7.net]
典型的な例がそれね

893 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 12:40:45.30 ID:8PjODHJ7.net]
一応言うけど、親切7割で書いてんだよ

894 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 12:46:22.23 ID:miXQ60Mg.net]
int sum = 0;
for(int i = 1; i <= 10; i++) {
 sum = sum + i;
}
左辺のn+1項までの和を右辺のn項までの和を使って再定義します
他にどう読める?

895 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 12:49:12.16 ID:8PjODHJ7.net]
そんな話じゃない

896 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 12:50:45.59 ID:CQ0buOj1.net]
俺は親切10割で書いてるよ

897 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 12:53:54.77 ID:o0S33vFB.net]
再帰関数ってのは問題に対する言葉じゃなくて、それをどうコーディングするかに対する言葉

898 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 13:04:05.67 ID:miXQ60Mg.net]
ttp://akita-nct.jp/saka/lecturenote/2010/2e/text/recursive.pdf

再帰関数講義pdf

899 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 13:15:58.86 ID:VTGxMrVA.net]
なにそのURL。だからなんだ?
あからさまに>>871は再帰じゃないって書いてあるが

900 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 13:22:34.79 ID:1eGH5HCM.net]
スレ



901 名前:読んだ
現実を直視することって大切だよなって思いました
[]
[ここ壊れてます]

902 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 13:37:10.03 ID:8kAWPtv+.net]
int sum = 0;
for(int i = 1; i <= 10; i++) {
 sum = sum + i;
}

これは明らかに再帰じゃないなw

これを再帰と説明しているページがアレば
いってくれ。

ないなら、黙ってろ。

903 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 13:38:20.61 ID:8kAWPtv+.net]
おっと、黙ってろっていうのは、
>>878に対してだけだだ。
別に>>878と関係ないことを話すのは構わない(笑)

904 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 13:45:24.53 ID:VTGxMrVA.net]
予測だが、抽象化や概念を扱うのが極端に苦手なんだろう
なのでそれを伴う会話、論理、もしくはそれ以前に単語の意味が理解出来ない

905 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 13:46:24.96 ID:miXQ60Mg.net]
ttp://akita-nct.jp/saka/lecturenote/2010/2e/text/recursive.pdf

再帰関数講義pdf

>>878
数列の和の再帰実装の項目が読めないの?

つづけて、

2.2 なぜ,再帰関数なのか?

再帰関数と繰り返し文のどちらを使ってもプログラムが書ける場合,
どちらを使うべきだろうか?
両方使える場合は繰り替えし文を使うべきである.
計算速度も早いし,メモリの消費も少ないからである.
ではどこで,再帰関数の登場機会があるのか.
単純な問題であれば繰り替えし文の方が良いが,
複雑な問題となると再帰関数で記述はできるが,
繰り替えし文ではプログラムが大変困難な場合がある.

906 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 13:48:14.91 ID:8kAWPtv+.net]
>>881
これのことだろうけど、
普通に、sumの中でsumを使っており、
そのsumの部分に再起するって書いてある。

/ / =========================
25 / / ユーザー定義関数 sum
26 / / =========================
27 i n t sum ( i n t n ) {
28
29 i f ( n == 1 ){
30 r e t u r n 1 ;
31 } e l s e {
32 r e t u r n sum ( n?1) + n ; / / 再帰する
33 }
34
35 }

907 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 13:49:21.03 ID:8kAWPtv+.net]
2 再帰関数とは
2.1 再帰関数の例
自分自身を呼び出す関数を再帰関数 (recursive function) という.また,自分自身を呼び
出すことを再帰呼出し (recursive call) という.言葉の定義はともかく,具体的な例を見て
みよう.



2.2 なぜ,再帰関数なのか?
再帰関数と繰り返し文のどちらを使ってもプログラムが書ける場合,どちらを使うべき
だろうか? 両方使える場合は繰り替えし文を使うべきである.計算速度も早いし,メモリ
の消費も少ないからである.で

908 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 13:51:10.04 ID:VTGxMrVA.net]
なんでループと再帰が同じって言ってるやつが、
両方使える場合はループだの、複雑なことは再帰だのになんだよ。
言ってることが支離滅裂。

909 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 13:57:22.43 ID:miXQ60Mg.net]
>>884
それはスコープスタックを

ループは保存しないで行ったっきり

再帰関数はpushして最下ノードまで行って
popして戻りつつ新たな下ノードのpush&pop検索をするからだよ

910 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 14:00:39.98 ID:VTGxMrVA.net]
>>878
この方法にしとけ

for(int i = 1; i <= 10; i++) {
 sum = sum + i;
}
「これは再帰関数です」とか「これは再帰ではありません」とか明示的に書いてあるやつがいい
それなら理解出来るだろ

あと再帰やループの制御構造は、forやwhileや関数の呼び出しだからな。
決してsimではない



911 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 14:01:24.37 ID:VTGxMrVA.net]
>>885
保存しないのがループなんだろうが

912 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 14:07:04.25 ID:miXQ60Mg.net]
ttp://ja.wikipedia.org/wiki/%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%BD%E3%83%BC%E3%83%88
クイックソート

そんなに言うならループで書いてみてよ

913 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 14:20:43.68 ID:VTGxMrVA.net]
繋がりが分からん

914 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 14:21:51.14 ID:miXQ60Mg.net]
>>884
>>885
>>888

915 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 14:22:35.47 ID:VTGxMrVA.net]
ただの一度とて俺はループで何が出来るだの出来ないだの一覚えはない
頭大丈夫か?

で?ルールで書けってことは「ループじゃない物」があるってことだよな?
それをここにいるほぼ全ての人は再帰と読んでるわけだが

916 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 14:28:26.07 ID:miXQ60Mg.net]
>なんでループと再帰が同じって言ってるやつが、
>両方使える場合はループだの、複雑なことは再帰だのになんだよ。
>言ってることが支離滅裂。

>両方使える場合はループだの、複雑なことは再帰だのになんだよ。
これが支離滅裂と思うんなら、クイックソートをループで書いてごらん

917 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 14:47:29.00 ID:LToipCL/.net]
書くのはおまえだろうが。


918 名前:俺はループと再帰の区別してるから。
再帰はループとは別にあるし、再帰が良いと思った時は再帰だ。俺はな。
そして支離滅裂なのはそのURLじゃなくておまえだ。

おまえは区別しないなら全部同じ書き方でかけ。
ループと再帰と言う単語すら使うな。区別しないなら徹底的に区別するな。

それ以前に
for(int i = 1; i <= 10; i++) {
 sum = sum + i;
}
これが再帰と書かれたサイトなり資料なり探し終わるまで黙っとけ。多数に言われてんだから。
[]
[ここ壊れてます]

919 名前:デフォルトの名無しさん [2015/09/06(日) 14:51:28.16 ID:pbpREKnW.net]
>>888
>>892

ループで書いた
peace.2ch.net/test/read.cgi/tech/1434079972/8

920 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 14:53:47.20 ID:LToipCL/.net]
知らんわんなもん
おまえはループと書くな。区別しないのだから



921 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 14:55:26.13 ID:miXQ60Mg.net]
分かってませんでしたって言うなら言えばいいよ
クイックソートのループ実装はムチャ振りだから

922 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 14:57:32.04 ID:LToipCL/.net]
なんの話だ?
関係ない話なら「後から」付き合うけど?
ごちゃごちゃ言ってないでさっさと探して来い。

923 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 14:59:58.98 ID:miXQ60Mg.net]
>>894
push&popって、わざわざ作ってループにするくらいなら
素直に再帰関数使えよ

push&popのループは実装にもよるけど再帰関数とほぼ同じ

924 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:00:49.47 ID:LToipCL/.net]
ループは再帰なのにループの実装は無茶振りねぇ
ふーーん

ま、これについても探してきてから相手してやるか

925 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 15:01:20.67 ID:miXQ60Mg.net]
>>898
>>885

926 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:03:20.65 ID:LToipCL/.net]
それはループと再帰を区別してるっていうんだよ。
単語が必要になった時点でな

927 名前:デフォルトの名無しさん [2015/09/06(日) 15:03:29.78 ID:JSf18249.net]
>>898
ループで実装しとけばpopの過程で残りの処理やらんでいいわってときに
処理を打ち切れるんだよ。そういう意味では再帰をループで実装する意味はあるかと。

928 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 15:03:31.85 ID:miXQ60Mg.net]
>>899
>>885
push&pop実装してループすりゃ良いけど、それなら素直に再帰関数使え

929 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:04:44.43 ID:8kAWPtv+.net]
2 再帰関数とは
2.1 再帰関数の例
自分自身を呼び出す関数を再帰関数 (recursive function) という.また,自分自身を呼び
出すことを再帰呼出し (recursive call) という.言葉の定義はともかく,具体的な例を見て
みよう.



2.2 なぜ,再帰関数なのか?
再帰関数と繰り返し文のどちらを使ってもプログラムが書ける場合,どちらを使うべき
だろうか? 両方使える場合は繰り替えし文を使うべきである.計算速度も早いし,メモリ
の消費も少ないからである.で

930 名前:デフォルトの名無しさん [2015/09/06(日) 15:05:50.49 ID:JSf18249.net]
>>903
再帰よりもループのが都合いいことあるんよ
関数呼び出しを途中で打ち切ること出来ぬでしょ



931 名前:デフォルトの名無しさん [2015/09/06(日) 15:06:30.03 ID:JSf18249.net]
>>904
これ。

932 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 15:06:41.80 ID:miXQ60Mg.net]
>>902
再帰関数に強制終了フラグを渡して
再帰呼び出しの直後にそのフラグをチェックすれば
強制終了できるけど?

933 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:09:02.09 ID:LToipCL/.net]
>>903
pushとpopでループさせるなんて一言も言ってないし、
再帰使わないとも一言も言ってないし、
どうゆう会話の繋がり構造してんだ?
本気で頭大丈夫か?

しかもそれ完全にループと再帰分けて考えてるよな

934 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 15:09:21.10 ID:miXQ60Mg.net]
>計算速度も早いし,メモリの消費も少ないからである
push&popを実装するなら、正直、コンパイラに任せたほうが早いかもよ

935 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:10:20.50 ID:LToipCL/.net]
>>907
馬鹿じゃねぇの
それは再帰として使ってるとは言わん
普通ではない事態だ

936 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:11:18.97 ID:LToipCL/.net]
>>909
それをお前はあたかもそうではないような書き込みしてたよな

937 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 15:15:01.76 ID:miXQ60Mg.net]
>>908

>>751
>>885

938 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:16:40.15 ID:LToipCL/.net]
それ俺の書き込みじゃないけど。
それと言葉に詰まると全く意味の分からない安価書くのやめれ

939 名前:デフォルトの名無しさん [2015/09/06(日) 15:17:02.84 ID:JSf18249.net]
>>907
アプリケーションを強制終了?
ちょっとそれはクソすぎると思うよ

940 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:20:07.58 ID:LToipCL/.net]
for(int i = 1; i <= 10; i++) {
 sum = sum + i;
}
それとこれが再帰っつーのがお前の主張だからね。
話散らすのに一生懸命なようだけど。



941 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 15:22:44.17 ID:miXQ60Mg.net]
>>910

>>905
の振りだから
>>907
だろ

int recHoge(bool& esc){
 int i;
 //push処理
 i=rechoge(esc);
 if(esc) return i;
 //pop処理
 return i;
}

942 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:27:09.64 ID:LToipCL/.net]
>>916
あんな、出来る出来ないじゃなくて
関数として

943 名前:扱われるえき概念を、処理中の内部からスタック操作なんてしねぇんだよ []
[ここ壊れてます]

944 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:31:29.36 ID:LToipCL/.net]
んで結局、ループと再帰を区別しないと言うお前の主張は、
ループや再帰と言う単語を用いないとできないわけだね。
ふーーん

945 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 15:33:09.34 ID:miXQ60Mg.net]
何コメントが気に入らないの?

int recHoge(bool& esc){
 int i;
 //再帰のスタックがpushされている時の処理をここに書く
 i=rechoge(esc);
 if(esc) return i;
 //再帰のスタックがpopされている時の処理をここに書く
 return i;
}

946 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:34:42.95 ID:LToipCL/.net]
はい全然会話がつながってない。それは関係ない。

947 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 15:34:48.30 ID:miXQ60Mg.net]
>ループと再帰を区別しないと言うお前の主張
これが俺の主張だというならアンカくれ

948 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:37:06.65 ID:LToipCL/.net]
探すのめんどくさい。
しかし一つや二つではない


for(int i = 1; i <= 10; i++) {
 sum = sum + i;
}
より確実なのはこっち

949 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 15:37:11.26 ID:miXQ60Mg.net]
>>920

>>917
じゃあ、↑がイミフ

950 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 15:40:50.25 ID:miXQ60Mg.net]
>>922
探せないなら
ループと再帰を区別しない
これはおれの主張じゃないからね

sumについては
>>856



951 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:42:44.84 ID:LToipCL/.net]
お前の理解度なんて知らんわ。
その話題の発端は俺じゃないからそこについて続ける気もしない。

952 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:44:30.52 ID:LToipCL/.net]
漸化式になってようとなってまいと再帰には関係ない

953 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:45:19.69 ID:LToipCL/.net]
お前の言い分だとプログラムのほぼ全てが再帰になる

954 名前:デフォルトの名無しさん [2015/09/06(日) 15:47:23.50 ID:JSf18249.net]
>>894
1個は末尾再帰なので単純にループでいいかと
https://ideone.com/r1BBhE

955 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 15:51:29.03 ID:miXQ60Mg.net]
広辞苑から
漸化式
数列または関数列のいくつかの要素の間に成り立つ一般的な関係式
公比rの等比数列a1,a2,...,an,...におけるan+1=ranの類

「再帰的定義: "再帰的定義"を参照」
 an+1=ran

956 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:51:35.63 ID:8kAWPtv+.net]
俺が某大学のテキスト探してきた。

大学のテキストだから書いてあることの
信頼性は高いだろう。

再帰関数講義pdf
akita-nct.jp/saka/lecturenote/2010/2e/text/recursive.pdf


2 再帰関数とは
2.1 再帰関数の例
自分自身を呼び出す関数を再帰関数 (recursive function) という.また,自分自身を呼び
出すことを再帰呼出し (recursive call) という.言葉の定義はともかく,具体的な例を見て
みよう.



2.2 なぜ,再帰関数なのか?
再帰関数と繰り返し文のどちらを使ってもプログラムが書ける場合,どちらを使うべき
だろうか? 両方使える場合は繰り替えし文を使うべきである.計算速度も早いし,メモリ
の消費も少ないからである.で

957 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 15:55:01.72 ID:LToipCL/.net]
>>929
そんな広辞苑は捨てな
しかもそれプログラム用語の再帰じゃないから。
そんなことも分かってないようだけど。

958 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 15:59:49.39 ID:miXQ60Mg.net]
ttp://ews2.cc.niigata-u.ac.jp/~takeuchi/tbasic/BackGround/Recursive.html

再帰処理

959 名前:デフォルトの名無しさん [2015/09/06(日) 16:00:19.25 ID:JSf18249.net]
日本語は文脈依存文法なので
同じ語句であっても文脈に応じて意味が変わるのよね。
再帰という同じ言葉であっても概念が異なっているのは明らかっすね。
変数への再帰的な代入と関数の再帰呼び出しとは違うものっすね。
プログラムで再帰といったときは関数の再帰呼び出しが一般的かな。

960 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 16:02:09.24 ID:miXQ60Mg.net]
再帰的とは

あるものが定義されている場合,

その定義の中に,更にその定義されるべきものが,
簡単化されて,含まれているとき,

それは「再帰的である」と言われます。
循環論法に似ていますが,少し違います。
再帰的はその部分に含まれるものが全く同じものではなくて,
簡単になったもので,最終的終了条件が明示されているものです。



961 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:02:41.93 ID:LToipCL/.net]
どうして100のうち1しかないものを持ってくる?
現場でそんな使い方してる人間なんていないだろよ

962 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 16:07:43.63 ID:miXQ60Mg.net]
漸化式が再帰だと思えないのは変な風に、頭が固いか、悪いか、なだけ

963 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 16:12:02.55 ID:miXQ60Mg.net]
つか、再帰「関数」のみが、再帰だと思ってるのが間違いだから

964 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:13:02.94 ID:LToipCL/.net]
再帰はただの定義。

自分自身を呼び出す関数を再帰関数 (recursive function) という.また,自分自身を呼び
出すことを再帰呼出し (recursive call) という.

関数として抽象化されいてそのように扱う人間がいて、
その上でその内部から自身を呼び出すものが再帰。
プログラムにおいて漸化式は再帰と関係ない。

そしてその主張をするメリットもそのように使用するメリットもなく、そのように単語を使う習慣ももメリットもない。

965 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 1 ]
[ここ壊れてます]

966 名前:6:14:07.91 ID:LToipCL/.net mailto: 再帰と書いた場合は再帰関数を示す。以後そうしとけ。 []
[ここ壊れてます]

967 名前:893 mailto:sage [2015/09/06(日) 16:21:21.57 ID:uhlPSgY9.net]
>>928
>単純にループでいいかと
うん,そのつもりだったんだが
さて >>928 で 配列 {3, 3, 5} をソートしてみてくれないか?

968 名前:デフォルトの名無しさん [2015/09/06(日) 16:23:38.18 ID:JSf18249.net]
>>937
会話をするときは相手がどういう概念を
述べているのか理解するようにしないと
言葉の表面から別の概念を連想して相手が間違いだと言っても
話が噛み合わないだけっすよ。

969 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 16:25:07.28 ID:miXQ60Mg.net]
>>760
この場合は、
再帰「関数」とループで、ほぼ等価な処理を書いたのだが
この処理は、どちらも再帰処理だよ
定義に忠実な書き方と、最適化された書き方で
ほぼ等価な漸化式の処理であって、これらの何が気に食わないの?

970 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:25:30.37 ID:fH7ggWtR.net]
ここまで狂ってるともう駄目だろ、、、
脳の一部は正常に機能しているようだけど、他の部分が完全に機能していない
そういうのを普通「発達障害」「アスペ」「ADHD」とか言うんだけどな
好きなのを取れ
要するに一生何をしてもこのままです



971 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:25:40.08 ID:8kAWPtv+.net]
俺がもう一つ見つけてきてやったぜ

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

↑再帰を使わなくても,次のように実現することが出来ます。

972 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:28:08.20 ID:LToipCL/.net]
>>942
その発想がすでに狂ってる。

973 名前:デフォルトの名無しさん [2015/09/06(日) 16:29:29.10 ID:JSf18249.net]
>>940
やってみた。次は何をやればいい?服はもう脱いだ。
https://ideone.com/1x5POb

974 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:30:15.65 ID:LToipCL/.net]
また狂った勘違いされそうだけど、当然ながら記述どうこうの話ではない。
そんな話は一切していない

975 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:36:31.57 ID:fH7ggWtR.net]
正当な評価すら「人格攻撃」としてしか受け取れない
脳が狂っている度合いがひどければひどいほど、傍からみて「あ、こいつ完全におかしい」と
分かるようになるんだが、本人は1ミリも狂っているとは思っていない
病識が全くないわけだ

軽症だと治りやすいよ
でも末期のガンとか生まれつき片手がないとかはどうしようもないだろう
この後者に相当するのがこいつ

976 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 16:37:24.66 ID:miXQ60Mg.net]
論理で勝てないと人格攻撃で自分の醜態をさらす

977 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:38:50.50 ID:fH7ggWtR.net]
>>949
な、ほらそうだろ?お前、無職だろ?こんな奴雇う会社日本にねえよ
アメリカにでも行って一芸を買ってもらうこったな
でも見てたらその一芸すら怪しいようだが

978 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 16:39:04.92 ID:miXQ60Mg.net]
>>760
この場合は、
再帰「関数」とループで、ほぼ等価な処理を書いたのだが
この処理は、どちらも再帰処理だよ
定義に忠実な書き方と、最適化された書き方で
ほぼ等価な漸化式の処理であって、これらの何が気に食わないの?

さて?これのどこがどう狂っているのか説明してくださいな

979 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:39:14.91 ID:LToipCL/.net]
一番論理と遠いのはお前だよ
だからこうゆう展開になってしまう

980 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:40:05.81 ID:LToipCL/.net]
>>951
そこに結びつける発想。



981 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:40:52.39 ID:fH7ggWtR.net]
>>951
もうその発言だけで完全に狂ってると分かっちゃうよ

982 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 16:42:56.55 ID:miXQ60Mg.net]
感情的にではなく論理的に反駁してください

983 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:43:54.24 ID:LToipCL/.net]
だから狂った勘違いされないよう

984 名前:ノ「記述にもなんにも関係ない」と、
普通の人にはしないような備考をわざわざ付けたのに、それでも勝手に勘違いしてるだろ
それを指して狂ってるって言ってんだよ

だから何も会話が成り立ってない。関係ない思うを関係あると思う。
そして概念のつながりである論理のやりとりが出来てないのに自分が出来てないと気づかない。
[]
[ここ壊れてます]

985 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:45:18.24 ID:fH7ggWtR.net]
>>955
感情的にはまったくなっておりません
むしろ感情的になっているのはそちらの方だと思います
こういうのを「感情転移」と言います
もう少し言うと「投影機制」と言います

自分が感情的になっているのを認められないので、相手が感情的になっていると
錯覚してしまうのです
電車に乗ってて隣の電車が発車すると、自分の乗ってる電車が逆方向に動き出した
と錯覚するだろ?それとよく似ている

986 名前:デフォルトの名無しさん [2015/09/06(日) 16:47:03.14 ID:JSf18249.net]
>>955
それはこっちのセリフです!牛さんのように反芻してください!!
どうこれ?

987 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:48:22.69 ID:LToipCL/.net]
むしろ俺は書き始めた時の方が感情的だ
いまは至って冷静だ

988 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 16:48:38.17 ID:miXQ60Mg.net]
>>760
この場合は、
再帰「関数」とループで、ほぼ等価な処理を書いたのだが
この処理は、どちらも再帰処理だよ
定義に忠実な書き方と、最適化された書き方で
ほぼ等価な漸化式の処理であって、これらの何が気に食わないの?

だから↑がどう論理的に狂ってるか具体的にかけよ

989 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:49:14.49 ID:LToipCL/.net]
>>960
その発想だって言ってんだろ

990 名前:893 mailto:sage [2015/09/06(日) 16:49:40.04 ID:uhlPSgY9.net]
>>948
よくわかるが,今回の場合は反駁側も切れ味が悪い,揚げ足を取りきれていない
篭手狂人は「行っていることが正しい」可能性はないわけではない
問題は「不正確な表現」,百歩譲っても「表現が独特すぎて伝わっていない」



991 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:50:18.66 ID:fH7ggWtR.net]
>>959
あららここまでひどいとただの投影じゃなくて投影性同一視が入ってるみたいですね
境界性パーソナリティ障害とか自己愛性パーソナリティ障害も併発してるようです
投影性同一視とは他人を利用した自己嫌悪です
本当は自分を嫌悪したいのですがどうしてもそれが嫌なのでまともな他人を嫌悪します
これはしばしば犯罪に発達します
危険ですよ

992 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:51:40.98 ID:fH7ggWtR.net]
>>962
だとすればまあちょっとは自覚があるんじゃないですかね
そうなると治療すれば治る可能性もあるのに惜しいですね
このまま人生を棒に振っちゃうようで

993 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:53:01.63 ID:fH7ggWtR.net]
よく犯罪者が言ってるじゃないですか
「俺は悪くない!悪いのは社会だ!」
裁判所でそれ叫んでみてくださいよ
誰も認めちゃくれませんから

994 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 16:57:12.75 ID:LKKBkxwK.net]
これ、まさか次スレもやるつもりですか?

995 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2015/09/06(日) 16:57:13.89 ID:0zNPIayW.net]
プログラミングの現場で再帰と言ったら再帰関数や再帰呼び出しのこと。
情報科学で漸化式は再帰的定義であると言える。
しかし、プログラミングでプログラムに書いた漸化式を「再帰処理」と言うと、
初心者にとって混乱極まりない上に迷惑であり、不適切な表現である。

996 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 16:59:16.85 ID:miXQ60Mg.net]
>>960

>>760
のようにほぼ等価な処理が書けるのに
再帰「関数」で実装されたもののみが「再帰処理」だとしたら
ループで最適化実装されたものは「ループ処理」で
再帰処理とは違う処理なのですか?

997 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:00:59.76 ID:LToipCL/.net]
>>960
それ自体が関係ないのになぜその書き込みを引っ張る?
その処理が気に食う気に食わないの話はどっから出てきた?
なんで急に脈絡なくその書き込みの話をする?
漸化式は関係ないからって言われた直後、なんでその相手に自慢げに漸化式の話をする?
定義に忠実がなんだ?だからどうなんだ?満たされるのはお前の自己満足だけだろ
しかも

998 名前:自分の思い込みだけで狂ったように連呼する定義。
最適化?誰がそんなの望んだ?誰がそんな話した?噛み合ってないよな。


狂ってるんだよ
狂ったものは論理と最も遠い。
論理じゃないものに対して論理では答えられない。
[]
[ここ壊れてます]

999 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:05:43.20 ID:aWMMHCvX.net]
>>968
そう。

そしてさらに、関数は処理だけを指すものではない。
人間側が関数を関数と言う概念として扱い、そのように人間が振舞うことで初めて関数は関数になる。
当然それと同等の物が再帰にある。

普通はこんな説明不要だが、お前はこの説明も受けておく必要がある。

1000 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:05:55.81 ID:8kAWPtv+.net]
とりあえず俺が見つけてきた解説をみて。
再帰とは何かを勉強した方がいい。

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

↑再帰を使わなくても,次のように実現することが出来ます。



1001 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 17:06:58.08 ID:miXQ60Mg.net]
>漸化式は関係ないからって言われた直後、
>なんでその相手に自慢げに漸化式の話をする?

漸化式から再帰処理コードを組み立てる
スタックオーバーロードがあるから、再帰関数は奥の手で
ループで書けるならそれに越したことはない
ループでひどく複雑になるようなときに、再帰関数で書く

1002 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:08:24.25 ID:8kAWPtv+.net]
そして、もう一つの解説。俺が某大学のテキスト探してきた。

大学のテキストだから書いてあることの
信頼性は高いだろう。

再帰関数講義pdf
akita-nct.jp/saka/lecturenote/2010/2e/text/recursive.pdf


2 再帰関数とは
2.1 再帰関数の例
自分自身を呼び出す関数を再帰関数 (recursive function) という.また,自分自身を呼び
出すことを再帰呼出し (recursive call) という.言葉の定義はともかく,具体的な例を見て
みよう.



2.2 なぜ,再帰関数なのか?
再帰関数と繰り返し文のどちらを使ってもプログラムが書ける場合,どちらを使うべき
だろうか? 両方使える場合は繰り替えし文を使うべきである.計算速度も早いし,メモリ
の消費も少ないからである.で

1003 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:08:25.12 ID:aWMMHCvX.net]
>>972
だからその発想が狂ってる。
そんな話はしていない。

だから論理にならない

1004 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 17:13:29.91 ID:miXQ60Mg.net]
>>970
>>760
あのさ、このπを求めるコードで、まず関数入出力を見て
実装が、再帰関数実装とか、ループ実装とか、
普通、いちいち、そこまでこだわらないと思うんだけど
こだわるのは、精査検証が必要なときだけだろ

精査検証なら
>>972

1005 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:14:49.58 ID:fH7ggWtR.net]
>>959
酒買ってきた
まさにこれだよな
「論理的じゃないものに対して論理では答えられない」
狂ってる奴が「論理的に反駁してください」と言っているのを聞くと笑いそうになる

あのさあ・・・まず先に論理的に話すべきなのはそちらじゃないかね、って
でもそれが全く出来ない
だから発達障害なんだよ

1006 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:15:55.83 ID:fH7ggWtR.net]
ちごた
×>>959
>>969

>狂ってるんだよ
>狂ったものは論理と最も遠い。
>論理じゃないものに対して論理では答えられない。

俺が言いたい事と全く同じ

1007 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2015/09/06(日) 17:16:46.42 ID:0zNPIayW.net]
関数かループかは実行スピードに大きく影響する。円周率を求めるプログラムではスピードが重要。

1008 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:17:41.58 ID:8kAWPtv+.net]
俺が持ってきた再帰の定義について
反論ができなくなってしまっているようだなw

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

↑再帰を使わなくても,次のように実現することが出来ます。

1009 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 17:17:44.80 ID:miXQ60Mg.net]
ttp://ews2.cc.niigata-u.ac.jp/~takeuchi/tbasic/BackGround/Recursive.html
再帰は使うべきか
このように見てくると,再帰プログラムは効率の良くないプログラムと思うかもしれません。
実はある意味ではその通りです。それでは使う必要のないものなのでしょうか?
これも使わなくて良ければと言う前提に立てばその通りです。
一般に次のことが言えます。
•再帰プログラムは計算機に負荷をかけるプログラムである。
•時によっては,膨大な負荷をかけることもある。
•簡単に非再帰プログラムとして書けるものは再帰プログラムを使うべきではない。
それでも,再帰プログラムが基本的であると言われるのは何故でしょうか。
それは再帰プログラムが大きな力を秘めているからです。つまり
•再帰プログラムでは簡単に書けるが,非再帰プログラムはかなり複雑なプログラムになってしまうようなものがある。
ということです。
このような問題が意外とあるのです。再帰プログラム技法を,身につけたら,プログラミングを行う際,次のような視点で考えるのが良いかもしれません。
•まずは,非再帰プログラムで問題を考えてみる。
•難しいと判断した場合,再帰プログラムで考えてみる。

1010 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:18:47.18 ID:8kAWPtv+.net]
そして、もう一つの解説。俺が某大学のテキスト探してきた。
自分自身を呼び出したものが再帰なのだ。

大学のテキストだから書いてあることの
信頼性は高いだろう。

再帰関数講義pdf
akita-nct.jp/saka/lecturenote/2010/2e/text/recursive.pdf


2 再帰関数とは
2.1 再帰関数の例
自分自身を呼び出す関数を再帰関数 (recursive function) という.また,自分自身を呼び
出すことを再帰呼出し (recursive call) という.言葉の定義はともかく,具体的な例を見て
みよう.



2.2 なぜ,再帰関数なのか?
再帰関数と繰り返し文のどちらを使ってもプログラムが書ける場合,どちらを使うべき
だろうか? 両方使える場合は繰り替えし文を使うべきである.計算速度も早いし,メモリ
の消費も少ないからである.で



1011 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:20:26.48 ID:aWMMHCvX.net]
>>975
はいここでまた関係ない話になる。
今してる話は何が再帰か(定義と概念)、であって、
手段の問題ではない。
当然>>972もなんの関係もない。

1012 名前:ただの手順。

そんな考えだから再帰中に再帰中の内部記憶を操作するとような発想を平気でする。
再帰を再帰として扱ってはいない。これは概念の問題。
再帰を扱う人がそれを再帰扱いしなければ、当然それは再帰ではない。

再帰かどうかと言うのはそういった所でも大きく区分けされる。
[]
[ここ壊れてます]

1013 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 17:24:43.59 ID:miXQ60Mg.net]
>>982

>>932
>>934

1014 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:27:47.47 ID:aWMMHCvX.net]
だからその返信に詰まった時に安価書くのやめれっつーの
お前の再帰の定義が問題扱いされてるのに、
自分の正当性を得るために自分の定義を証明手段に使ってどうする
馬鹿なのか

1015 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:28:54.74 ID:1q8+1kZD.net]
>>984
自分が狂ってる事を正当化するために自分が書いた狂った定義を持ち出すのは
もはや負けを認めているのに等しいよな

1016 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 17:29:38.53 ID:miXQ60Mg.net]
>>932
のリンクの大学教授の定義をコピペしたのが
>>934


1017 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:32:05.22 ID:1q8+1kZD.net]
>>986
今度は権威を使うのか
"虎の威を借る狐"
でもその虎が狂っていたらどうなる?ただの殺人虎だ

1018 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:34:21.82 ID:8kAWPtv+.net]
>>986

> >>932
> のリンクの大学教授の定義をコピペしたのが
> >>934
> だ

>>932のリンクってこれだよね?
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
↑再帰を使わなくても,次のように実現することが出来ます。

1019 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:34:24.36 ID:aWMMHCvX.net]
もう一度教えてやろう。
それは普通は使わない定義

1020 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 17:34:49.74 ID:miXQ60Mg.net]
だから、お前らは、俺に対して、感情的反駁しかしてねーし



1021 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:36:03.31 ID:1q8+1kZD.net]
>>988
うはw
捏造入ってたのか
こりゃちゃんとリンク先見ないとな

>>990
何回でも言います
感情的になってるのはそっちです

1022 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:37:16.64 ID:1q8+1kZD.net]
再帰定義は、ありまぁーす!みたいな展開になってきたな

1023 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 17:37:25.62 ID:miXQ60Mg.net]
>>989
算数からやり直したらどう?
算数→数学→情報処理となって
再帰定義がなんぞやって定義されているんだよ

1024 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:37:27.94 ID:aWMMHCvX.net]
あと答えられなくなったとき必ず
答えなくなったり話散らすね。
直接的に繋がりのある返答はかなり珍しい

他の人が増えてきて読みにくいんで終わり

1025 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:38:07.17 ID:uhlPSgY9.net]
>>946
おーうまくいくね>>984 では,これに苦心したんだが‥

1026 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:38:14.61 ID:aWMMHCvX.net]
>>993
数学用語とプログラム用語は別物だと言ったはずだ

1027 名前:NAS6 ◆n3AmnVhjwc [2015/09/06(日) 17:39:58.36 ID:miXQ60Mg.net]
>>996
お前の中ではな

1028 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:40:39.85 ID:aWMMHCvX.net]
ついにそうゆうことしか書けなくなったわけだね

1029 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:40:58.46 ID:1q8+1kZD.net]
>>993
おやお前数学出来るのか
じゃあマクスウェルの方程式とかナビエ・ストークスの方程式の意味は説明出来るんだよな?

1030 名前:デフォルトの名無しさん [2015/09/06(日) 17:41:53.70 ID:LZy823VQ.net]
暇人か



1031 名前:デフォルトの名無しさん mailto:sage [2015/09/06(日) 17:42:12.67 ID:1q8+1kZD.net]
>>994
自分を守るのが精一杯でちゃんと他人の質問に答えれなくなってるよな

1032 名前:1001 [Over 1000 Thread.net]
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

1033 名前:過去ログ ★ [[過去ログ]]
■ このスレッドは過去ログ倉庫に格納されています






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<275KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef