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

1デフォルトの名無しさん
垢版 |
2015/11/28(土) 18:51:38.86ID:Rc2MJzM/
なあ、再帰関数好きな人いる?
2015/12/02(水) 10:13:14.24ID:amR8vvu9
>>92
数学的に証明されてる。
2015/12/02(水) 10:15:05.34ID:UkYZlpUx
>>96
そうなのか、、、
ならできるようにならなきゃだな
2015/12/02(水) 11:13:43.91ID:sE+ivAhG
>>92
再帰は機械的にCPSに書き換えることで末尾再帰にできて
そうしたらそれをループに書き換えられる
両方証明されてる
2015/12/02(水) 11:28:01.97ID:SG5bn8pD
>>97
アセンブリ言語によくあるcall系命令の挙動を正確に言えるようになれば
どんな再帰もスタックとループで書けるようになるよ
何しろスタックとループで再帰を表現してるのがcall系命令だからね。

それをそのまま書くとこんな具合に超汚くなるけど。
https://ideone.com/0QXd8O
2015/12/02(水) 12:52:27.49ID:UkYZlpUx
ありがとうございます
2015/12/02(水) 18:34:40.93ID:73uUfhWJ
uyなかなかやるな。
ググって解答見た可能性もあるが、ググれるのも実力のうちだからな。
2015/12/02(水) 20:57:19.51ID:V8iEgN6C
>>90
> ちなみにここ一週間のuyの生活は、朝起きて、ネトゲして朝寝る です。
悲観することはない(してないかもしれないがw)
それも一つの生き方だ
人間の人生などそんなものだ
2015/12/02(水) 22:54:08.11ID:73uUfhWJ
https://ideone.com/upRuBk
アッカーマン関数の展開の様子を書いてみた。
メモリリークあるけど気にしない。
もっとスマートにかけそうな気もするが言語が悪いのかな?
2015/12/03(木) 13:20:12.94ID:lU1L6vf0
誰かループ版と再帰版でベンチマークしてみなよ
2015/12/03(木) 13:56:10.07ID:cYXsvyZR
>>103
俺も書いてみたけど
確かにどう書いてももうちょっとスマートに書ける気がする。
https://ideone.com/BFP2wh
2015/12/03(木) 17:06:18.36ID:Sp77D/ez
>>105
メンドクサイやつだなお前w
2015/12/03(木) 17:30:30.61ID:Sp77D/ez
>>104
ack(3,10)を100回計算させたところ

ループ 3.99秒
再帰 4.50秒

だった。微妙にループが速い。
言語はg++ 最適化あり
2015/12/03(木) 17:54:16.46ID:cYXsvyZR
>>106
でも115行目以降は>>103に比べてスマートじゃない?
アッカーマン関数をより素直に表現している(ように見える)というか。

テンプレートその他がひじょーに面倒臭い事になってるのは認めるよww
2015/12/03(木) 18:28:15.45ID:Sp77D/ez
>>108
まあそうかも。
言語によってはめちゃくちゃ簡潔に書けたりするのかな、気になる。
2015/12/03(木) 19:58:47.04ID:cYXsvyZR
>>109
ちなみに扱ってるのがアッカーマン関数だけだということとか考慮しつつ短く書くとこうなる。
https://ideone.com/ILFKf2
2015/12/03(木) 20:19:17.43ID:Sp77D/ez
>>110
だいぶスッキリした。
でも入れ子構造がなくなっちゃってるのはちょっと寂しいかな。
2015/12/03(木) 22:49:14.77ID:Sp77D/ez
https://ideone.com/hlWWly
んんん、haskell 気持ちいい!
2015/12/04(金) 18:59:19.58ID:abMxFNxB
きっしょ
2015/12/04(金) 20:33:45.20ID:tAWNVevx
んぎもちいいいいいいいいいい
2015/12/05(土) 12:06:08.66ID:kPO9yvRD
気持ち悪い生き物だなこいつは
116デフォルトの名無しさん
垢版 |
2015/12/05(土) 12:08:54.94ID:75VGJDuj
再起関数難しくて苦手だわ
117デフォルトの名無しさん
垢版 |
2015/12/05(土) 12:38:44.60ID:vOhmiziG
おいらも苦手だわ
2015/12/05(土) 12:50:09.98ID:fWHJ2v3J
アッカーマンを知ったばかりで嬉しくてしょうがないんだろうな
俺くらいになるとどうでもよくなるけど
2015/12/05(土) 14:22:16.61ID:3X0n/q/1
さぁ次は竹内関数(たらい回し関数)だ!
2015/12/05(土) 14:24:24.30ID:FIUesRuL
>>118
アッカーマン関数が原始帰納関数でない証明を頼む。
定義がシンプルかつ一般帰納関数になるように
アッカーマンさんが構成したらしいが。
2015/12/05(土) 16:27:08.57ID:fWHJ2v3J
その問題が解けて嬉しかったんだろうな
2015/12/05(土) 22:53:23.45ID:Ij5oOkBB
たらいのループ化と展開の様子誰か頼む
2015/12/07(月) 01:05:16.16ID:OW/BWl2V
なんで自分でやらない?

再帰関数が好きなんだろ?
2015/12/07(月) 02:12:06.27ID:IGEuV37f
2015/12/07(月) 19:27:26.73ID:NCOmGjcr
https://ideone.com/63bZSE

たらいの展開の様子

haskell気持ちEー!

ループ化は誰か頼むわ
2015/12/08(火) 10:04:03.24ID:HiEYAt85
きも
2015/12/10(木) 22:01:50.93ID:ZuWvmJPo
たらいのループ化どうやるかわからん。
2015/12/10(木) 23:27:19.50ID:ZuWvmJPo
んーなんかプログラムカウンタに相当するものをスタックに積まなきゃいけない感じ?
2015/12/11(金) 02:06:03.72ID:6gh0GR4/
https://ideone.com/rO18tw
んーできたっぽい?
コンパイラの吐いたアセンブラとか見ながら書いたからチートしてるけど。
2015/12/11(金) 13:42:03.51ID:Z+QL5bbx
再帰厨はcall命令とjmp命令の違いが分かってから布教してほしい
2015/12/11(金) 18:14:40.60ID:H0NYZxX+
>>130
何言ってるんだ。。
ループで書けば早い、自分でスタック作れば、って言ってるループキチガイに、
命令にもこういうのがあるよ、必要だからあるんだよ。
と教えてあげてはどうだ?
2015/12/11(金) 18:27:07.72ID:FXKTAEC3
>命令にもこういうのがあるよ、必要だからあるんだよ。

だからどうしたとしか。
基地外宗教を布教するなら、自分でするんだね。
2015/12/11(金) 19:01:03.96ID:DIOiIqvd
callとjumpの中間の命令もあるよな。
call使わない奴はいないのか?
2015/12/11(金) 19:02:56.29ID:6gh0GR4/
中間の命令ってなんだよ?
2015/12/11(金) 19:40:32.13ID:DIOiIqvd
>>134
MIPSのjalとjrとか。
callとretに相当。
jal相当すらなくてpcのレジスタ保存命令しかないのもあった。
2015/12/13(日) 22:44:03.31ID:1ET048aA
ツリーのイテレータってどう書くの
誰か頼む
137uy ◆Qawu9.2l1E
垢版 |
2015/12/14(月) 05:58:59.61ID:0uboKikK
まずはこの手のアルゴリズム抽象化でC++使うのをやめろ
効率悪すぎ
138uy ◆Qawu9.2l1E
垢版 |
2015/12/14(月) 06:02:04.72ID:WJU5GahL
ツリーのイテレータっつうか
ゲームプログラミング的にいえばツリー構造のタスクシステム
ゲームプログラミングしてれば普通に書いてるような低レベルの話
2015/12/14(月) 11:28:00.80ID:v4oN6dOD
>>136
ツリーのイテレータの書き方は大きく分けて3種類ある。
一つ目はイテレータ自身に「どのノードを辿ってきたか」って情報を覚えさせておいてそれを用いる方法
イテレータの空間効率がO(log n)になる代わりにサクセッサの時間効率が平均でO(1)になる。
二つ目はイテレータ自身にキーを覚えさせておいて、一旦そのキーを手繰ってから次のノードを手繰り直す方法
イテレータの空間効率がO(1)になる代わりにサクセッサの時間効率がO(log n)になる。
三つ目は木構造の各葉っぱに次の葉っぱへのポインタを書いておく方法
イテレータの空間効率がO(1)、サクセッサの時間効率がO(1)になる代わりに葉要素のサイズがO(1)増える。
2015/12/14(月) 11:57:14.44ID:S7hw1GZs
イテレータってそんなにたくさん使うもんじゃないし、一つ目がいいかな、俺的に。
141uy ◆Qawu9.2l1E
垢版 |
2015/12/14(月) 15:02:59.78ID:WIf5dtaV
それ種類じゃなくて、全部組み合わせて実装したほうが汎用的じゃねーの

class A
  attr_accessor :up , :key , :list , :data
end

最低でも1と3のup listは無ければ木構造にならないだろ
君の考えは prev(up) と next(list) になってる
2015/12/14(月) 16:34:38.86ID:S7hw1GZs
全部組み合わせたほうが汎用的?
何を言ってるかよくわからん
143uy ◆Qawu9.2l1E
垢版 |
2015/12/14(月) 21:12:22.29ID:WIf5dtaV
まず、ツリーにしたらそれはイテレータとは呼ばないから
ただのツリーを走査する為の関数に過ぎない

「イテレータ」にしか使用できないツリーじゃなくて
一通りの事に使用できるツリークラス作れば?って話
2015/12/14(月) 21:30:28.83ID:lwFUcSQC
function NodeIterator(node, childNodesName) {
  this._stack = [node];
  this._name = childNodesName;
}
NodeIterator.prototype.hasNext = function() {
  return this._stack.length > 0;
}
NodeIterator.prototype.next = function() {
  var node = this._stack.pop();
  if (node) {
    for (var i = node[this._name].length -1; i > -1; --i) {
      this._stack.push(node[this._name][i]);
    }
  }
  return node;
}

ノードの親や深さも欲しい時は、スタックに積むノードをオブジェクトでラップして親の参照や深さを持たせればいいかも
2015/12/14(月) 22:23:44.30ID:S7hw1GZs
uyのイテレータの定義がさっぱりわからん。
俺はC++STLのイテレータを想像しているんだが。
uyの言ってるイテレータはなんのイテレータなんだ?
2015/12/14(月) 23:47:42.33ID:S7hw1GZs
uyが言ってるのはツリーで実装されたイテレータということかな?
俺が言いたいのはツリーを巡回するイテレータなんだが?
2015/12/15(火) 02:12:24.45ID:1v1TladX
コレクションを操作するのがイタレータ
148uy ◆Qawu9.2l1E
垢版 |
2015/12/15(火) 02:28:13.41ID:hKbS74r3
センスないと無理
2015/12/15(火) 02:42:41.61ID:1v1TladX
>>147
それを言うなら走査だろと自分で突っ込んどく
150uy ◆Qawu9.2l1E
垢版 |
2015/12/15(火) 02:44:41.16ID:xpC/Gts5
例えば
[1,2,3,4] ← これをイテレートするのがイテレータだろ?

ツリーは
[1,2,[3,4,[5,6]]] ← これをイテレートしたいのが作りたいイテレータだろ?


下のはイテレータと表現するまでもなくプログラム中でツリー構造が必要になって、
「ツリークラス」ってのを定義した事あれば、そんなのは標準実装しているレベルのものだから、わざわざツリーのイテレータなんていう半端なものは誰も作らない

作る順序的にまずはイテレータのツリー化じゃなくて、ツリークラスの定義
考えが追いつかないなら好きな順序で作れば良いけど
151デフォルトの名無しさん
垢版 |
2015/12/15(火) 07:32:58.54ID:1zInVUKk
ツリーオブジェクトにtoArray()メソッドを用意すれば
すべて解決すると思うの。
2015/12/15(火) 10:44:59.05ID:kfL23r5/
大富豪プログラミングだなtoArray()
ツリーなんかはサイズが非常にデカくなることがしばしばあるぞ。
2015/12/15(火) 18:13:10.16ID:kfL23r5/
tAo.kQ2STk ってテレンスタオから取ってんの?
2015/12/15(火) 18:56:51.85ID:kfL23r5/
>>150
汎用的なツリークラス作れって言ってんのか?
javascriptみたいになるんじゃね?
2015/12/15(火) 19:28:58.56ID:1tm7yObV
>>153
違うよ。人間が読める某文字列をキーにしたらその酉が作れる。

ところでさ、どうでも良いんだけど
今話題にしてるのは木構造
>>141が示したデータ構造は無向グラフ
・・・・・・だよね?
156デフォルトの名無しさん
垢版 |
2015/12/15(火) 22:38:36.35ID:WpFCIHcQ
ツリーじゃね
2015/12/15(火) 22:42:50.33ID:kfL23r5/
参照が木構造になってるかグラフになってるかなんて実行時に決まることじゃないのか?
158デフォルトの名無しさん
垢版 |
2015/12/16(水) 03:41:52.77ID:L2apS2Qu
何だこの池沼w
159デフォルトの名無しさん
垢版 |
2015/12/16(水) 09:38:17.31ID:VSvjkteq
ごめん
2015/12/16(水) 21:37:56.27ID:OpCUYLL/
いいってことよ
161デフォルトの名無しさん
垢版 |
2015/12/17(木) 17:19:47.96ID:Szn4FINI
Elixir再帰おもろい
http://confreaks.tv/videos/elixirconf2014-introduction-to-elixir-for-rubyists
162デフォルトの名無しさん
垢版 |
2015/12/18(金) 23:27:00.37ID:95zCi6v5
プログラマはMacを使ってるってマジ?
http://hayabusa3.2ch.net/test/read.cgi/news/1450395043/
163デフォルトの名無しさん
垢版 |
2015/12/19(土) 15:12:57.98ID:iG82T79N
メモメモ
http://izumi-math.jp/M_Harada/kinou_o/kinou_o.pdf
http://examist.jp/mathematics/recurrence-formula/suitei/
http://mathtrain.jp/fibonacci
2015/12/19(土) 16:17:36.19ID:qhiLE2sk
制御では、実行時間が読めないアルゴリズムは使いにくい。
2015/12/19(土) 16:48:17.67ID:mZAnd63z
再帰と繰り返しは相互に変換可能なんだから、再帰で実行時間が読めないならば、繰り返しでも読めない。
こんなじょうしきも知らないの?
166デフォルトの名無しさん
垢版 |
2015/12/19(土) 20:02:11.53ID:owy4KRbC
ごめん
2015/12/19(土) 20:16:05.69ID:hx9j/3Ds
再帰はシステムダウンの危険がある。
処理速度もはるかに遅くなる。

再帰の場合には、こうした実行時間が読めない特有の問題点がある。
2015/12/19(土) 22:02:48.92ID:EjHtX5K0
> 再帰はシステムダウンの危険がある。
そう言う環境ならば、システムダウンの可能性は繰り返しでもある。

> 処理速度もはるかに遅くなる。
ヘボが作った繰り返しは再帰よりはるかに遅い。
2015/12/19(土) 22:20:57.65ID:ZeO9ImyW
>>168
繰り返しと再帰はいっしょなんだろ?
2015/12/19(土) 22:22:37.57ID:EjHtX5K0
>>169
お前、バカなんだろ。
2015/12/19(土) 23:26:42.72ID:25MZJC6Y
末尾再帰に対応した言語が少ないからなぁ
2015/12/19(土) 23:29:13.06ID:srVmyYNw
普通の言語は対応してる
変な言語は使うもんじゃない
173uy ◆Qawu9.2l1E
垢版 |
2015/12/20(日) 01:30:16.73ID:cCXQYS6+
# 1
def f
 if 条件
  処理
 else
  f()
 end
end

# 2
def f
 if 条件
  f()
 end
end


# 3
def f
 case 条件
 when LABEL
  f()
 end
end


末尾再帰されるパターンわからない奴wwwwwwwwwwwwっうぃる? 
2015/12/20(日) 01:48:28.93ID:XCzWC+ME
>>172
Java「…」
175デフォルトの名無しさん
垢版 |
2015/12/20(日) 12:14:12.80ID:8RLYRFXT
>>175
漸化式
2015/12/20(日) 12:15:13.29ID:37nsyMmy
それは、無限再帰
2015/12/20(日) 14:49:43.30ID:zNzoBoA2
ID:EjHtX5K0のような白痴ばかりだから
再帰厨だと馬鹿にされることになる。

再帰を愛して使うんだったら、
ループ版にはない深刻なデメリットがある事ぐらいちゃんと注意した上で、
効率や安全性を無視したプログラミングを楽しむべき。
2015/12/20(日) 17:18:50.85ID:37nsyMmy
繰り返しの唯一の利点は回数の制御が再帰よりも容易であること。
これ以外の利点はない。

バカにはそれが理解できないらしいが。
2015/12/20(日) 17:26:49.52ID:8RLYRFXT
馬鹿には出来ませんね
180デフォルトの名無しさん
垢版 |
2015/12/20(日) 18:23:24.49ID:/qKlyz5E
ごめん
2015/12/20(日) 19:26:33.84ID:37nsyMmy
再帰はID:zNzoBoA2のように低知能には理解不能という弱点があるけど
ID:zNzoBoA2のような低知能の出現率は低いので全然問題無い
むしろ低知能者を検出試験としてのメリットの方が大きい
182デフォルトの名無しさん
垢版 |
2015/12/20(日) 22:01:31.82ID:ywvYIxL3
再帰苦手だから何でもかんでもループ使ってすまん
2015/12/20(日) 22:05:01.79ID:A/4Tj+iv
flattenとか難しいよね
2015/12/20(日) 22:51:10.83ID:zNzoBoA2
もし再帰が理解出来たつもりなら、ちゃんとループに直せるぐらいのプログラミング技術は備えなくちゃ。

最低でもそれくらいの技術や知能が無ければ
再帰を楽しむことはできないよ。
2015/12/21(月) 02:17:48.47ID:EKnooMo4
「再帰には深刻なデメリットがある」キリッ
なんて発言する低知能人は再帰を理解してるはずが無い、理解不能なものを怖れている。未開人と同じ。
2015/12/21(月) 09:54:25.69ID:S8kWm1db
ループを恐れるのは、ループにするだけの知識・経験を欠いているから。

その程度じゃあプログラミングの世界からすぐに消えるだけの存在。
再帰厨は、現実で満たされないのでスレで妄想を垂れ流すことしかできないクズ。
2015/12/21(月) 10:52:48.60ID:zel3cCjW
関数内にjmpも好き勝手にやるタイプだからどうとも言わんけど、
再帰否定派はまさか単一のアーキテクチャの話してないよな?
アルゴリズムとして再帰がイケてないって話だよな?
188デフォルトの名無しさん
垢版 |
2015/12/21(月) 14:23:04.48ID:MyhUNItP
そうなのか?
189デフォルトの名無しさん
垢版 |
2015/12/21(月) 14:51:29.83ID:EKnooMo4
>>186
必死で再帰を否定しているバカを弄っているだけで、繰り返しを否定しているわけでは無い

やっぱり低知能なんだな。
190デフォルトの名無しさん
垢版 |
2015/12/21(月) 18:43:17.30ID:u4st+H+L
みなさん、これが「弄ってるって言いたいバカ」ですw
191デフォルトの名無しさん
垢版 |
2015/12/22(火) 08:48:59.73ID:kujr6tD9
迷信を信じ込んで再帰を否定してるバカが
深刻なデメリット(爆笑)、例えば
> 処理速度もはるかに遅くなる。
を、実証すればスレ終了するのに。
2015/12/22(火) 11:16:51.41ID:4uBr+2Cy
>>191
そういう超基本的なプログラミング知識が無いのに
なんでプログラム板にいるの?

そもそもプログラミング経験無いだろ、お前。
2015/12/22(火) 12:54:32.04ID:S5fGjlFA
異様に伸びてると思ったら深刻な問題祭りかい

いくらでも例外は挙げられるけど
再帰で書こうがループで書こうが計算時間や空間計算量はそんなに変わらんから
書きやすく、読みやすい方で書いたほうが良いんじゃない?

そんなに変わらないって言うのは十分大きな入力に対して精々2〜3倍以下に納まるって意味だからね。
1時間掛かる処理を20マイクロ秒速くする為にごちゃごちゃ書き換えるのは結構な事だけど。
2015/12/22(火) 14:08:14.84ID:dkSLpih8
はるかと言っても所詮定数倍でしょ。
しかも一桁違うケースは
関数呼び出しがやや高価なスクリプト系の言語でもほとんどないでしょ。
2015/12/22(火) 17:31:14.37ID:qPz15M1W
>>193
いやね,絶対的に再帰でないと書けない,いや非常に書きにくいものはあるのは確かで.
たとえば代数式の解析を非再帰的で記述しろといわれると「はたして出来るのか??」と逡巡してしまう.
こういう話題があまり発展しないのはどうしたわけですかね

関係ないけどquick-sort を三項演算子とコンマ演算子で書く話題,誰か‥私は挫折した‥
2015/12/22(火) 18:25:40.50ID:/7VurpfC
再帰の深刻なデメリットと言えば、コンパイラ設計者が甘えてる事によってバグを触ったり
異常に速度遅くなるパターンが放置されてたりする事

なんの言語とは言わないけど
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況