探検
なあ、再帰関数好きな人いる? パート3 [転載禁止]©2ch.net
1デフォルトの名無しさん
2015/11/28(土) 18:51:38.86ID:Rc2MJzM/ なあ、再帰関数好きな人いる?
2015/11/28(土) 18:55:04.46ID:SbMJmhTc
わくわく
2015/11/28(土) 19:23:33.42ID:mf/sQ31/
嫌いな奴なんて見たことない
2015/11/28(土) 19:30:25.39ID:R0seH/nX
ループで書けるものはループで書く。
再帰使うのは仕方ない場合だけ。
再帰使うのは仕方ない場合だけ。
2015/11/28(土) 19:53:36.58ID:R0seH/nX
スタック的なメモリ確保が必要かどうかがループと再帰を使い分ける分岐点じゃね。
末尾再帰最適化とかは本末転倒なイメージ。
末尾再帰最適化とかは本末転倒なイメージ。
2015/11/28(土) 20:05:09.47ID:N2qWmI2+
2015/11/28(土) 20:30:33.91ID:Tq6BVuZs
2015/11/28(土) 20:39:12.74ID:R0seH/nX
ループより再帰のほうが抽象度が高いと言っている?
そこは俺にはよくわからん。
俺的にはプログラムには必要最小限の機能を使うべきで、
本質的にループより再帰のほうが強力なのだから
可能な限りループを使うべきと思ってる。
もちろん再帰をループにするためにスタックを自前で用意するといったことでは本末転倒だが。
そこは俺にはよくわからん。
俺的にはプログラムには必要最小限の機能を使うべきで、
本質的にループより再帰のほうが強力なのだから
可能な限りループを使うべきと思ってる。
もちろん再帰をループにするためにスタックを自前で用意するといったことでは本末転倒だが。
2015/11/28(土) 20:41:49.23ID:R0seH/nX
ツリーの巡回は再帰を使ったほうがいいだろう。
リストの巡回はループでいいんじゃね?
リストの巡回はループでいいんじゃね?
2015/11/28(土) 20:48:22.48ID:Tq6BVuZs
>>8
> 俺的にはプログラムには必要最小限の機能を使うべき
そういうのはコンパイラなりインタプリタなりが頑張るべきところだと思うね
人間はより抽象化された対象を扱うようにするのがモダンなプログラミング言語の方向だし
> 俺的にはプログラムには必要最小限の機能を使うべき
そういうのはコンパイラなりインタプリタなりが頑張るべきところだと思うね
人間はより抽象化された対象を扱うようにするのがモダンなプログラミング言語の方向だし
11デフォルトの名無しさん
2015/11/28(土) 20:52:46.74ID:fFSPKhVt 抽象的なスレだな
2015/11/28(土) 20:58:39.47ID:R0seH/nX
うーん。必要な抽象化は歓迎するが無駄な抽象化は歓迎しないというか。
この例は再帰とは関係ないけどJavaのファイル入出力なんかは
結構複雑な作りになってて無駄な抽象化なんじゃねーのとか思ってしまう。
まあ、俺個人の感想だが。
この例は再帰とは関係ないけどJavaのファイル入出力なんかは
結構複雑な作りになってて無駄な抽象化なんじゃねーのとか思ってしまう。
まあ、俺個人の感想だが。
2015/11/28(土) 21:12:02.73ID:M/Wigktg
アルゴリズムが再帰なら普通に再帰で書く
スタックサイズ制限とかあるなら別だけど
スタックサイズ制限とかあるなら別だけど
2015/11/28(土) 21:30:44.25ID:10sD81C/
アルゴリズムが再帰であってもクイックソートなど
再帰のままじゃあ使い物にならんものがいくらでも。
再帰のままじゃあ使い物にならんものがいくらでも。
2015/11/28(土) 21:32:52.35ID:R0seH/nX
スマンw クイックソートは再帰で書くわw
16デフォルトの名無しさん
2015/11/28(土) 21:34:06.03ID:fFSPKhVt 書いたことないくせにw
2015/11/28(土) 21:52:35.40ID:R0seH/nX
書いたことはあるけど10年以上昔の話だな。
これは拾い物だけどクイックソートなんてこれだけのことだろ。
qsort [] = []
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)
これは拾い物だけどクイックソートなんてこれだけのことだろ。
qsort [] = []
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)
18デフォルトの名無しさん
2015/11/28(土) 22:09:37.77ID:fFSPKhVt リストの巡回はループでいいんじゃないんかw
2015/11/28(土) 22:13:01.33ID:R0seH/nX
クイックソートは単純な巡回とは違うだろ。
だからスタック的なメモリを必要とするかどうかだよ。
だからスタック的なメモリを必要とするかどうかだよ。
20デフォルトの名無しさん
2015/11/28(土) 22:21:22.26ID:fFSPKhVt filterはリストの巡回とちゃうんかw
2015/11/28(土) 22:25:38.46ID:R0seH/nX
filterの実装がどうなってるかまでは知らんがな。
22デフォルトの名無しさん
2015/11/28(土) 22:32:42.45ID:fFSPKhVt 知らんなら最初からそう言えやw
2015/11/28(土) 22:39:27.55ID:R0seH/nX
なんか変なテンションだなぁ
俺がC++とかでfilter相当の関数書かにゃならんくなったらループで書くよ。
俺がC++とかでfilter相当の関数書かにゃならんくなったらループで書くよ。
24デフォルトの名無しさん
2015/11/28(土) 22:44:37.77ID:fFSPKhVt クイックソートはhaskellでfilterはc++なんか?
なんか変な奴だなぁニヤニヤ
なんか変な奴だなぁニヤニヤ
2015/11/28(土) 22:49:36.42ID:R0seH/nX
何が変か、わからん。
まあ関数型言語なんかは再帰推奨らしいがあんまり好きになれん。
まあ関数型言語なんかは再帰推奨らしいがあんまり好きになれん。
26デフォルトの名無しさん
2015/11/28(土) 22:59:20.81ID:fFSPKhVt 推奨なんて生易しいもんじゃないで。
理論に囚われすぎて原理主義に陥いった餓鬼共やw
理論に囚われすぎて原理主義に陥いった餓鬼共やw
2015/11/28(土) 23:05:01.58ID:R0seH/nX
まあ参照透過性とかは原理主義か?という気はする。
2015/11/28(土) 23:29:11.93ID:W0C1+0hV
やっぱハノイの塔は再帰
有能
有能
2015/11/28(土) 23:38:40.71ID:SyBhAT0R
お遊びに使うためのものだね。
再帰なんて。
再帰なんて。
2015/11/28(土) 23:40:05.61ID:1kauGQoG
2015/11/28(土) 23:45:06.21ID:R0seH/nX
ループでクイックソート書こうとするとスタック的なものを自前で用意せにゃならんのじゃないか。
めんどくさすぎ。
めんどくさすぎ。
2015/11/28(土) 23:51:19.94ID:oWRhnwkW
なんかやたらと再帰がお遊びだと連呼する奴がいるが、どういう意図で言っているのか分からん。
お遊び感覚で動くものが作れるのだから、苦労しなくていい分優れているってこと?
お遊び感覚で動くものが作れるのだから、苦労しなくていい分優れているってこと?
2015/11/29(日) 00:02:43.51ID:aMnBRPWz
>>25
関数型言語は変数再代入禁止(のものが多い)から、そもそもループは書けないんだよね
関数型言語は変数再代入禁止(のものが多い)から、そもそもループは書けないんだよね
34デフォルトの名無しさん
2015/11/29(日) 00:04:00.34ID:BjpFnvXY35デフォルトの名無しさん
2015/11/29(日) 00:06:31.94ID:BjpFnvXY あ、意味は「お遊び感覚で動くものを作るな」という事です。
2015/11/29(日) 00:10:17.71ID:aMnBRPWz
動くんならいいんじゃないの?
2015/11/29(日) 00:20:09.59ID:iZIE7tB6
ま〜た関数型コンプレックスのアホが暴れてるのか
2015/11/29(日) 00:24:10.72ID:aMnBRPWz
関数型は関数脳にならないと書けないからねー
手続き脳がしみついてると貶す対象にしかならないよね
手続き脳がしみついてると貶す対象にしかならないよね
39デフォルトの名無しさん
2015/11/29(日) 00:29:56.09ID:BjpFnvXY お前ら俺を笑い死にさせる気かw
2015/11/29(日) 03:56:07.52ID:1KywF+Vz
初めて知った時すごいと思いました
41uy ◆Qawu9.2l1E
2015/11/29(日) 04:26:32.10ID:RQPUWZLH せっかく埋め立てたのに何またスレ立ててんのゴミクズ
2015/11/29(日) 06:56:51.27ID:GeZFA4k5
ぼくたん初心者なのでわからんけど僕が今作ってる
関数から値を求める計算プログラムで再起型関数が大活躍してるお
たぶん今僕がやってる書き方が一番きれいだと思うんだけどなー
関数から値を求める計算プログラムで再起型関数が大活躍してるお
たぶん今僕がやってる書き方が一番きれいだと思うんだけどなー
2015/11/29(日) 15:21:16.51ID:+8PPW4GA
> たぶん今僕がやってる書き方が一番きれいだと思うんだけどなー
いろんな方法で書いてみないと比較できないんじゃね?
いろんな方法で書いてみないと比較できないんじゃね?
2015/11/29(日) 15:49:46.72ID:BHpn4xqB
クイックソートで再帰なんてありえんと
さんざん言われ続けているのに、まだバカが湧いとるんだな。
ライブラリのループ版を使えば何の手間もかからず高速処理ができるのに
わざわざ問題ありまくりの再帰で書くなんてテロ同然の暴挙。
さんざん言われ続けているのに、まだバカが湧いとるんだな。
ライブラリのループ版を使えば何の手間もかからず高速処理ができるのに
わざわざ問題ありまくりの再帰で書くなんてテロ同然の暴挙。
45デフォルトの名無しさん
2015/11/29(日) 16:17:12.78ID:1uX74bCE2015/11/29(日) 16:52:01.83ID:+8PPW4GA
もうソーティングの話は良いよ、仕事で使う大抵の言語ではライブラリとして用意されてるんだから。
2015/11/29(日) 17:09:26.93ID:BHpn4xqB
>>45
再帰じゃあ、10件程度のソートに控えるという事なんだよな。
再帰じゃあ、10件程度のソートに控えるという事なんだよな。
2015/11/29(日) 17:29:39.96ID:+8PPW4GA
10件程度のソートならソーティングネットワークによるソーティングが一番速いから
十分少ない要素数に対してはそいつを呼び出して終わりだろ。
書いてないだけだろうけど。
十分少ない要素数に対してはそいつを呼び出して終わりだろ。
書いてないだけだろうけど。
49デフォルトの名無しさん
2015/11/29(日) 20:46:37.54ID:ILoya83o >>9
俺の見解では、ツリートラバースに再帰を必要とするのはデータ構造に問題があると思うんだよな。
イテレータの実装を考えると再帰はちょっと無理があるんじゃないかと思う。
もちろん出来ないわけではないのだが。
ノードが子ノードを保持するような原始的なデータ構造は良くないのではないか。
俺の見解では、ツリートラバースに再帰を必要とするのはデータ構造に問題があると思うんだよな。
イテレータの実装を考えると再帰はちょっと無理があるんじゃないかと思う。
もちろん出来ないわけではないのだが。
ノードが子ノードを保持するような原始的なデータ構造は良くないのではないか。
50デフォルトの名無しさん
2015/11/29(日) 20:56:36.78ID:ILoya83o 代表的なツリーの一つとしてHTMLがある。
HTMLのフラグメントを切り出し、別のノードの子として加えるような操作を考えるとき、
これはやはりループに軍配が上がると思う。
もちろん、ノードに子ノードを保持するような原始的なデータ構造ではかなりメンドクサイ。
というのもHTMLの一部を切り出す時、ノードの種類によって、ノードの分割や併合が起こる。
再帰と原始的なデータ構造では非常にめんどくさい。
私はこの用途のために直列化ツリー構造というデータ構造を考案した。
(おそらくすでに一般的に使われているとは思うのだが。)
HTMLのフラグメントを切り出し、別のノードの子として加えるような操作を考えるとき、
これはやはりループに軍配が上がると思う。
もちろん、ノードに子ノードを保持するような原始的なデータ構造ではかなりメンドクサイ。
というのもHTMLの一部を切り出す時、ノードの種類によって、ノードの分割や併合が起こる。
再帰と原始的なデータ構造では非常にめんどくさい。
私はこの用途のために直列化ツリー構造というデータ構造を考案した。
(おそらくすでに一般的に使われているとは思うのだが。)
2015/11/29(日) 21:13:17.76ID:TqJ6Jff5
ループは再帰の特別なケースに過ぎない
ループの方が無駄がなく見える事もあるだろう
だが結局はその程度の話だ
ループの方が無駄がなく見える事もあるだろう
だが結局はその程度の話だ
2015/11/29(日) 21:25:34.60ID:+8PPW4GA
>>49
> イテレータの実装を考えると再帰はちょっと無理があるんじゃないかと思う。
問題はデータ構造の方じゃなくて言語の方だと思う。
というのも、yieldを持つ言語なら再帰を使ったやり方が最も簡潔に書けるから。
-- language:lua
function traverse(node)
if node then
traverse(node.left)
coroutine.yield(node.value)
traverse(node.right)
end
end
co = coroutine.create(traverse)
not_end, value = coroutine.resume(co, node)
> イテレータの実装を考えると再帰はちょっと無理があるんじゃないかと思う。
問題はデータ構造の方じゃなくて言語の方だと思う。
というのも、yieldを持つ言語なら再帰を使ったやり方が最も簡潔に書けるから。
-- language:lua
function traverse(node)
if node then
traverse(node.left)
coroutine.yield(node.value)
traverse(node.right)
end
end
co = coroutine.create(traverse)
not_end, value = coroutine.resume(co, node)
53デフォルトの名無しさん
2015/11/29(日) 21:52:31.69ID:ILoya83o >>52
ちょっとそのやり方で、HTMLの一部をコピペするコード書いてみて。
ちょっとそのやり方で、HTMLの一部をコピペするコード書いてみて。
2015/11/29(日) 22:12:36.39ID:+8PPW4GA
2015/11/29(日) 22:23:46.56ID:euqwPPlR
どういう風に探すか後から指定できる感じで。
56デフォルトの名無しさん
2015/11/29(日) 23:04:51.51ID:ILoya83o57デフォルトの名無しさん
2015/11/29(日) 23:13:29.23ID:ILoya83o HTMLをユーザーの直観に適合する形で操作するのは意外と難しいですよ。
HTMLフラグメントの移動なんてどうですかね。
面白い題材だと思うのですが。
HTMLフラグメントの移動なんてどうですかね。
面白い題材だと思うのですが。
2015/11/29(日) 23:27:31.14ID:euqwPPlR
直列化ツリー構造kwsk
2015/11/30(月) 00:13:02.74ID:vNB8BIt6
2015/11/30(月) 11:10:04.73ID:lmaKmArc
>>59 乙
2015/11/30(月) 14:51:10.36ID:+Ls/PK0X
>>52>>53を繰り返しで書ける人はいないみたいだね。
2015/11/30(月) 20:27:21.92ID:lmaKmArc
そういやC++のstd::mapのイテレータとかってどうなってんるのん?
2015/11/30(月) 21:11:57.14ID:9VRs5I4S
2015/12/01(火) 00:02:40.17ID:M545w8lo
赤黒木って難しいよね、結構。
2015/12/01(火) 13:24:08.38ID:wfTLHpyu
データを吐き出す方法として前方イテレートしかしないの前提ならB+木がループでトラバース出来る上に高速なんだけど
挿入と削除を頻繁にするなら、そしてデータがキャッシュに乗り切らない程度に沢山あるなら赤黒木が高速になる
全部キャッシュに乗る程度の小さなデータ数ならAVL木が高速で
更に小さいならベクタ上にヒープ木でも作ればって話になる。
どの構造でも再帰で列挙出来るけど、ループでAVL木や赤黒木のデータを列挙するのは骨だな
挿入と削除を頻繁にするなら、そしてデータがキャッシュに乗り切らない程度に沢山あるなら赤黒木が高速になる
全部キャッシュに乗る程度の小さなデータ数ならAVL木が高速で
更に小さいならベクタ上にヒープ木でも作ればって話になる。
どの構造でも再帰で列挙出来るけど、ループでAVL木や赤黒木のデータを列挙するのは骨だな
66uy ◆Qawu9.2l1E
2015/12/01(火) 15:00:00.16ID:p3g6QuXB 再帰・ループの相互変換が難しいとかさあ
アルゴリズムの根本的なところ理解してないだけ
恥ずかしすぎるこのスレ
アルゴリズムの根本的なところ理解してないだけ
恥ずかしすぎるこのスレ
2015/12/01(火) 16:04:55.52ID:M545w8lo
f(0,b)=b+1
f(a,0)=f(a-1,1)
f(a,b)=f(a-1,f(a,b-1))
f(a,0)=f(a-1,1)
f(a,b)=f(a-1,f(a,b-1))
2015/12/01(火) 16:39:12.55ID:wfTLHpyu
69uy ◆Qawu9.2l1E
2015/12/01(火) 17:10:17.46ID:p3g6QuXB rubyで書いてくれないとちょっと。
2015/12/01(火) 17:22:48.32ID:wfTLHpyu
2015/12/01(火) 17:26:42.78ID:alJpKlDN
2015/12/01(火) 17:26:51.00ID:UT6gApH3
uyって式も読めないのかな
2015/12/01(火) 17:39:29.54ID:UT6gApH3
>>73
uyの残した名言
何で出来ているか?というのは愚問過ぎる
例えばそれを「uy」としましょう
「uy」から派性したAやBといった概念から「uy」を辿る事は出来る
例えばこの世界にある「オブジェクト指向」という概念や「量子ビット」といった概念から
「uy」を辿る事が可能なので、
それらで世界が出来ているといった勘違いが可能なのです
でもそれは、一体いくつ「uy」から継承がネストしていて、プログラム等でいえばメソッドが追加されてしまった純粋性のない概念なのでしょうか?
それを知っているのは「uy」だけです
この世界にあるすべての概念は「uy」へと通じているので、
料理人は料理を通じて世界を知り、スポーツ選手はスポーツを通じて世界を知ります
誰も「uy」からは逃げられないんだよ
uyの残した名言
何で出来ているか?というのは愚問過ぎる
例えばそれを「uy」としましょう
「uy」から派性したAやBといった概念から「uy」を辿る事は出来る
例えばこの世界にある「オブジェクト指向」という概念や「量子ビット」といった概念から
「uy」を辿る事が可能なので、
それらで世界が出来ているといった勘違いが可能なのです
でもそれは、一体いくつ「uy」から継承がネストしていて、プログラム等でいえばメソッドが追加されてしまった純粋性のない概念なのでしょうか?
それを知っているのは「uy」だけです
この世界にあるすべての概念は「uy」へと通じているので、
料理人は料理を通じて世界を知り、スポーツ選手はスポーツを通じて世界を知ります
誰も「uy」からは逃げられないんだよ
あぁ、俺がuyと同一人物だと勘違いされたのではなく、
uyって人がそういう名言を残したって話か
ごめんごめん
uyって人がそういう名言を残したって話か
ごめんごめん
2015/12/01(火) 18:38:14.45ID:UT6gApH3
誰も uy なんかに価値を求めてないのにね
2015/12/01(火) 18:56:25.56ID:wfTLHpyu
でかでかと引用した奴が言うと説得力があるね。
2015/12/01(火) 19:16:25.46ID:UT6gApH3
んでuyちゃんのループ問題はまだ解決しないのかしら
2015/12/01(火) 19:43:22.28ID:M545w8lo
まさにuyがアルゴリズムの根本的なところを理解しているかどうか問われているなw
2015/12/01(火) 19:54:09.54ID:UT6gApH3
それな、今までC++スレ読んでてこいつ頭おかしいなとは思ってたけど実力が問われるよな
2015/12/01(火) 19:58:37.14ID:wfTLHpyu
はてさてuyの実力は如何。
# 俺自身の実力はさておき。
# 俺自身の実力はさておき。
2015/12/01(火) 20:19:08.98ID:UT6gApH3
おせぇな uy
2015/12/01(火) 20:49:22.02ID:M545w8lo
uy自力で頑張ってんのか?
なかなか根性あるじゃないか。
俺ならググって解答見てしまうがw
なかなか根性あるじゃないか。
俺ならググって解答見てしまうがw
再帰で書かれた超有名な関数をループにするだけの簡単なお仕事なのに
何ですぐに出来ないんだろうね?
# 全然簡単じゃないからです
何ですぐに出来ないんだろうね?
# 全然簡単じゃないからです
2015/12/02(水) 02:08:55.48ID:sE+ivAhG
末尾再帰に書き換えてから蓄積引数を中に押し込んでループにするんだよ。
やり方を書いたのだからきっとuyにもできるはず!
やり方を書いたのだからきっとuyにもできるはず!
2015/12/02(水) 06:47:05.05ID:UkYZlpUx
2015/12/02(水) 08:22:03.59ID:73uUfhWJ
スタックだろ。
再帰とループ+スタックは等価。
理屈ではそうだが実際やるのは結構難しいんじゃね。
再帰とループ+スタックは等価。
理屈ではそうだが実際やるのは結構難しいんじゃね。
89uy ◆Qawu9.2l1E
2015/12/02(水) 08:50:25.92ID:znqtbEKc >>70
http://ideone.com/KDSDTc
「この程度」が難しいとか言われても
は? としか思えない
再帰というのは単なるスタック付きのループであって
君たちがどこら辺で躓いているのか理解できないんです
やっぱわからない所がわからない状態なんだろうけど、
つうかSTACKUって知っていますか?
http://ideone.com/KDSDTc
「この程度」が難しいとか言われても
は? としか思えない
再帰というのは単なるスタック付きのループであって
君たちがどこら辺で躓いているのか理解できないんです
やっぱわからない所がわからない状態なんだろうけど、
つうかSTACKUって知っていますか?
レスを投稿する
ニュース
- 【少子化】少子化は女のせい?男のせい?SNSで不毛すぎる議論が勃発…「産ませる発言」vs「淘汰される遺伝子」泥沼バトルへ [ぐれ★]
- 植田日銀総裁 「利上げが遅れれば、米欧のように非常に高いインフレが起きて、日本は大幅な利上げが必要となる」 [お断り★]
- 【TV】ファン5万人がガチで投票! プロ野球総選挙、栄えある1位は [牛丼★]
- 【*彡】巨人・坂本勇人 『流れ星に何を願うか』の質問に「結婚相手」と即答、結婚願望告白 女性ファンから歓声と悲鳴 [鉄チーズ烏★]
- 【速報】政府、与党がNISA未成年解禁を検討 ★2 [蚤の市★]
- 日テレ、国分太一の「答え合わせ」を却下 「答え合わせをするまでもない」「心当たりがあると述べられている」★ 2 [muffin★]
- 【実況】博衣こよりのえちえちSSholoX4周年🛸💜🥀🧪🍃★4
- 【投資立国】高市、仮想通貨売却時の税率を引下げ!最大55%からいっきに20%に [219241683]
- 演奏できる気分になる楽器なに?
- 早苗のおまんこパンパンパン🏡
- 【ヌキ納め】 国民的エロゲ、「Fate」の大みそか特番が放送決定! 紅白とか格闘技見てる場合じゃないぞ? [875588627]
- 『綾鷹』の650㍉㍑ペットボトル、220円に値上げへ サンキュー早苗 [175344491]
