[表示 : 全て 最新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使うの嫌いで基本的に再帰多用するんだが、だめなの?
皆から敬遠されてる気がする

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で良くないですか?
そう言う意味で、再帰よりループのが不要に見えるんですが






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

前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