[表示 : 全て 最新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
触っちゃダメ






[ 続きを読む ] / [ 携帯版 ]

前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