なあ、再帰関数好きな人いる? パート3 [転載禁止]©2ch.net
0001デフォルトの名無しさん
垢版 |
2015/11/28(土) 18:51:38.86ID:Rc2MJzM/
なあ、再帰関数好きな人いる?
0797793
垢版 |
2016/11/17(木) 13:03:18.99ID:u2Ucvcf0
>>796
Prologですから再帰述語で関数ではありませんが、

repeat :- 割り込みあり,!.
repeat :- repeat.

の場合、スタックの一番上でpop,pushを繰り返すことが可能なのではないでしょうか。
0798797
垢版 |
2016/11/17(木) 13:06:35.00ID:u2Ucvcf0
すみません。まちがえました。これではrepeat内でのループになってしまって
Prologのrepeatになりませんでした。分かり難くなりますから割り込みを外します。

repeat.
repeat :- repeat.
0799793
垢版 |
2016/11/17(木) 13:16:05.70ID:u2Ucvcf0
>>797 だと、
繰り返しを最終回にするための割り込みとしたかったのですが、
実行開始の遅延を終了するための割り込みになってしまっています。
0800デフォルトの名無しさん
垢版 |
2016/11/21(月) 07:42:33.65ID:Z9LRReIl
>>797
どういう条件だとスタックが伸びず、伸びることが不可避なのはどんな場合か。
0801デフォルトの名無しさん
垢版 |
2016/11/21(月) 09:29:48.04ID:IXIwDt6r
>>800
実行時、述語の最後の節で、最後の副目標(サブルーチン呼び出しにあたる)に差し掛かった時に
その節のそれまでの副目標が全て決定性(別解があり得ない)に終了しているという条件で、
この節の呼び出し時点までスタックを戻って、そこに新たな再帰呼出しの情報を積むことができる。
0806デフォルトの名無しさん
垢版 |
2016/11/22(火) 08:09:17.87ID:sAluFFeZ
再帰がスタックを積むんじゃなくて関数がスタックを積むんちゃうの?
スタックがなければ実現不可能な処理なら、ループで実装してもスタック積むんちゃうの?
0811デフォルトの名無しさん
垢版 |
2016/11/22(火) 13:48:40.05ID:sAluFFeZ
抽象概念が実体であるかのような基準で話をする人が多すぎる
再帰でスタックが発生するならそれに対比するループも必ず同等のスタック量が発生する。
それでも 「ループで実現したらスタックは積まれない」と言うのなら、それは実現できていない。

抽象概念としての名称は便宜上再帰であるかループであるかの違いはあるが、実体としての処理は必ず同等。
0813デフォルトの名無しさん
垢版 |
2016/11/26(土) 09:43:28.08ID:cQHpTyuw
>>811
再帰は、入れ子状の関数呼び出しで、呼び出す関数は全部同一だから、
コードは一つで良い。しかし、関数だから呼び出す度にスタックに情報を積むし、
戻ってくるまで、積んである情報をPOPできない。
ただし、関数が末尾に有る時、則ち、戻って来た情報に対して何らかの計算をしてから
情報を返すということがない関数に関しては、戻ってきた値を直接自分の戻す値に
できるわけだから、呼びだされた時の普通なら積む情報を積まずに済ませることが
できるかも知れない。こういうことを「実体」というのですないか?
0814813
垢版 |
2016/11/26(土) 09:45:28.00ID:cQHpTyuw
すみません。最後
こういうことを「実体」というのではないか?
です。
0819デフォルトの名無しさん
垢版 |
2016/12/22(木) 22:15:49.61ID:vkr4xxpW
継続は再帰ほど市民権得てないからなぁ。
継続を深く理解しているプログラマは全体の1割に満たないんだろうな。
0823デフォルトの名無しさん
垢版 |
2017/02/11(土) 02:50:31.54ID:JwDD7IDr
私は再帰の塊のようなプログラムを作ったことがある。
DirBaseだ。
起動後のウィンドウにエクスプローラからファイルやフォルダを
ドラグ&ドロップするだけで簡単にツリーができる。
DirBaseで検索すれば、ダウンロードできる。
0825デフォルトの名無しさん
垢版 |
2017/02/16(木) 15:31:02.48ID:VWTLMYuE
競プラではforループが盛んらしいが、言語開発者としては再起の方が使って欲しい
ソースは俺が今朝見た夢
0828デフォルトの名無しさん
垢版 |
2017/10/03(火) 20:26:43.27ID:GaATZUfo
(数値計算を主体とする)関数では使わないけど、
再帰ルーチンで使用頻度が激しいのは、外部記憶装置を含めた初期化ルーチン。
一つのルーチンで、内部記憶(主記憶装置)と外部記憶(HDD等)の出入りを管理している場合に、
初期化ルーチンで外部記憶が存在しない場合には、ルーチンで保存している定数を読みだして、外部記憶に保存する。
初期化ルーチンからの定数の読み出し・外部への保存が再起処理。
初期化ルーチン以外では使わない手法。
分割して作成すると、何年か後に見直した時に、どのように初期化しているのかわからない、という事態になることが多発したので、
初期化が必要な場合には、このような手法で同一ルーチン内に収めるようにした。

もっとも一番利用頻度の高いのは、Winでは、ダイアログボックスのプロシージャ。再起の塊で、何をしているのかわからなくなってくる。
0829デフォルトの名無しさん
垢版 |
2018/01/28(日) 06:23:28.69ID:GN9YKPqU
再帰プログラムは関数の呼び出しで積みあがるスタックを配列とみなせば、ループアルゴリズムそのものだ。
0830デフォルトの名無しさん
垢版 |
2018/01/28(日) 06:51:19.47ID:GN9YKPqU
ファイルやフォルダ、ダイアログやウインドウは階層構造で構成されるので、再帰プログラムを使うのが一般的だ。
0831デフォルトの名無しさん
垢版 |
2018/01/28(日) 15:26:22.97ID:Erw8GBm0
再帰って何?って頃から普通に再帰使ってたからなあ。
自分自身を呼び出せば良いじゃんみたいな。

高校で数列とか演繹法が得意だったせいかも。
自然に使ってた。
0832デフォルトの名無しさん
垢版 |
2018/01/28(日) 16:28:26.35ID:C2Jb//yt
再帰云々言ってるのは大昔のFORTRANとかCOBOLを使ってた人ぐらいじゃないのかな
あと組み込みとかでスタックサイズが厳しい環境で組んでるとか
0834デフォルトの名無しさん
垢版 |
2018/01/28(日) 18:03:09.52ID:GN9YKPqU
再帰プログラムの基本はスタックにデータを入れ積み上げていく過程と、スタックからデータを取り出しスタックをクリアしていく過程の二つの動作しか基本的にない。
データを取り出したら、そのデータを使ってプログラミングされた処理を実行する。スタックはデータを貯めることと同時に処理の順番を決めている。再帰のプログラミングには二つの概念が必要だ。
0836デフォルトの名無しさん
垢版 |
2018/02/23(金) 11:23:42.25ID:cixhX8OH
javaで再起処理書いたらガーベッジコレクションが掃除してくれるもんだと思ってたけど違うの?
十年前の記憶だから曖昧ですまない
cpu使用率が100%になるけど影響ないから使ってます〜って顧客に言われたのを思い出したもんやで
0838デフォルトの名無しさん
垢版 |
2018/02/23(金) 12:18:58.87ID:E8zJnigo
影響ないなら気にすんな
0839デフォルトの名無しさん
垢版 |
2018/05/23(水) 20:21:54.46ID:Au5e7VGg
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

980U0
0840デフォルトの名無しさん
垢版 |
2018/07/05(木) 01:23:47.56ID:RfoszcD2
TB1
0844デフォルトの名無しさん
垢版 |
2018/11/14(水) 23:02:37.97ID:ur2RK8H0
再帰アルゴリズムはなるべくライブラリで隠蔽して欲しいな。
自分で書くのはまだしも他人の再帰コードを読むのはかなり嫌。
0845デフォルトの名無しさん
垢版 |
2018/11/15(木) 12:26:32.11ID:yIPB3Fsn
好きなんか嫌いなんかハッキリしろや
0847デフォルトの名無しさん
垢版 |
2018/11/15(木) 16:22:56.36ID:zCiKr9uf
再帰関数と言えばアッカーマン関数とかたらい回し関数などが
有名ですが他にも何かある?
0848デフォルトの名無しさん
垢版 |
2018/11/15(木) 21:36:15.07ID:sS26qanx
有名じゃないからwどんな入りかたしたんおまえw
0849デフォルトの名無しさん
垢版 |
2018/11/16(金) 07:45:28.14ID:Q+Zstbtj
174 その名前は774人います (バットンキン MM5a-fW3D) 2018/11/16(金) 07:04:12.40 ID:N77Q/1ZeM
>ドラゴンクエストの世界観が全く反映されていないような印象

    ド ラ ゴ ン ク エ ス ト と は 何 か ?

ドラゴンクエストとは何かを問い続けるのが、終わらないドラゴンクエストだろう? 違うか?

2 その名前は774人います (バットンキン MM5a-fW3D) 2018/11/16(金) 07:42:40.97 ID:N77Q/1ZeM
再帰関数を理解するにあたり先輩社員に教えていただいたのですが、その時の再帰関数の例がとてもわかりやすかったので共有させていただきます。
この例のおかげもあり、はじめは再帰関数なにそれ状態から、最後はしっかりと実装できるようになりました。再帰関数はPythonで実装しています。
https://qiita.com/jumpyoshim/items/20e6b5e70efa466699b4
0850デフォルトの名無しさん
垢版 |
2018/11/16(金) 23:40:45.23ID:HodhQ/sE
問) 再帰的にオマンコを定義せよ
0851デフォルトの名無しさん
垢版 |
2018/11/16(金) 23:59:40.68ID:xavUeX/s
再帰関数『終わらないドラゴンクエスト』

ドラゴンクエストとは?(){
   ドラゴンクエストとは?()
}
0852デフォルトの名無しさん
垢版 |
2018/11/17(土) 00:12:17.17ID:eQWBxdMf
正直小学生のガチネタにはついていけん
0853デフォルトの名無しさん
垢版 |
2018/11/17(土) 03:28:35.36ID:corCuJCM
def DQ(n)
 puts "DQ #{n}"
 DQ(n+1)
end
0854デフォルトの名無しさん
垢版 |
2018/11/17(土) 10:42:46.80ID:B4GISbTr
({})
0855デフォルトの名無しさん
垢版 |
2018/12/16(日) 22:50:52.23ID:EHgXXRnO
バブルソート中
0857デフォルトの名無しさん
垢版 |
2018/12/18(火) 11:28:45.03ID:/M0/bFGF
グロ中尉
0858デフォルトの名無しさん
垢版 |
2019/03/20(水) 19:02:56.05ID:DvYG4dOj
>>1
好き嫌いの問題じゃないと思うが、理論上再起かそれと同等の内部処理履歴を残さないと実現できない処理なら、使うだろう
再起にならざるを得ない具体的な数学(科学)的な条件は忘れたが、けっこう複雑な処理じゃない限り再起じゃなくても実現できたように思う
0859デフォルトの名無しさん
垢版 |
2019/03/21(木) 01:23:23.96ID:b2sujHog
>>858
「再起」じゃなくて「再帰」ね

スタックを使えば、つまりメモリを余分に使用することを認めれば
再帰はループに書き換えることができるから
再帰でなければ出来ないことは原理的に存在しない

更に言えば関数を受け取りまた返す高階関数があれば
いわゆる不動点演算子に相当するものが書けるので
関数の再帰的定義は不要になる
0860デフォルトの名無しさん
垢版 |
2019/03/21(木) 03:46:03.75ID:v9ozWdAP
論理的にはクイックソートよりマージソートが好き。
実用性はクイックソートが上なのかな?
0861デフォルトの名無しさん
垢版 |
2019/03/21(木) 08:59:54.71ID:eS2pMQJr
>>859
>再帰はループに書き換えることができるから
そのループ再帰だよ・・・
再帰の問題点もそのまま同等に引き継いでるよ・・・
0863デフォルトの名無しさん
垢版 |
2019/03/22(金) 06:20:32.16ID:t/nkQ3ne
リストに対してはクイックソートやマージソートより選択ソートや挿入ソートのが速かった。
ケースによって使い分けるために色んなソートがあるんだなと実感した。
0864デフォルトの名無しさん
垢版 |
2019/03/22(金) 18:03:42.63ID:GIrPmH5o
どうゆう状況でそんなことが起こるのか想像できない
0866デフォルトの名無しさん
垢版 |
2019/03/22(金) 23:38:43.20ID:bs44Fjbm
>>861
ループと再帰とは違うよ
更に言えば高階関数があればループも再帰も必要ない
不動点演算子もループも再帰だと言うのはナンセンスだ
それは「再帰と同じだ」と君が思うものを再帰と呼ぶ、と主張しているに等しい
こんな君だけの主観による再帰の定義では議論にならない
0867デフォルトの名無しさん
垢版 |
2019/03/23(土) 01:46:30.69ID:05rjzlE7
チューリング完全なんだからどの言語でも一緒、という暴論と同程度に「ループと再帰は同じ」も暴論
コンピュータからみた話じゃなくて、プログラムを書く人にとってループと再帰が同価値なのかが問題になる
自分は、複雑でも読み溶ける再帰の方が好き。ループが複雑になると、どの変数がいつのどの値を持っているのか追いきれなくなる
再帰で同程度に複雑な処理を書くと、引数の数やら名前からすぐにヤバイ臭いがするんでそんなに腐らない
0869デフォルトの名無しさん
垢版 |
2019/03/23(土) 04:46:27.26ID:abrpiqJH
モナドな再帰(IOモナドやリスト->リストな再帰)は単純な再帰でもスタック消費しない。
繰り返しコードの単純さは再帰>末尾再帰>=ループ。
0872デフォルトの名無しさん
垢版 |
2019/04/04(木) 16:23:32.66ID:GBwqjObH
>>871
非同期処理の終了はイベントやコールバックで通知されるものとする
終了を待つ同期プリミティブは存在しない

Javascriptだとこれが普通で、繰り返しでは書けない
0874デフォルトの名無しさん
垢版 |
2019/04/05(金) 00:21:14.27ID:ZWKOySqx
async/await が JavaScript の新しい仕様として入ったのも知らんのか
0880デフォルトの名無しさん
垢版 |
2019/06/19(水) 05:49:29.73ID:K5sVxx6Y
再帰処理は
現在の関数が戻ってゆくアドレスをスタックに保存し、このアドレスを積極的に利用する。
プログラミングの実行アドレスをスタックから取り出して制御するので、
再帰プログラミングを利用するコツは、戻りアドレスを正しく理解することだ。

再帰は同じ関数を行ったり来たりするものだが、
日常の社会では、やらない方法だ。

普通は、配列を利用して、そこに保存してあるデータを使い、
同じ場所でプログラムを実行する
0888デフォルトの名無しさん
垢版 |
2021/01/11(月) 13:49:06.57ID:nJc/cTVc
λf . (λx . f (x x)) (λx . f (x x))
0890◆QZaw55cn4c
垢版 |
2021/01/13(水) 21:38:42.47ID:DfoNX22P
>>889

kwsk
ループ変数は再帰関数でも必要なのでは?
0891デフォルトの名無しさん
垢版 |
2021/01/14(木) 06:32:41.62ID:7/cCpBde
どんどんスタックにつめば確かにループ変数はいらない
ただ、人間のためにループ変数はあった方かいいと思うけど
0892デフォルトの名無しさん
垢版 |
2021/01/27(水) 21:57:40.49ID:fE6h5Ua/
再帰関数を理解したとき、最初にこれ考えたやつは天才だと思ったね
実行速度やスタック問題はともかくコードは見ていて美しい以外の何者でもない。
0893デフォルトの名無しさん
垢版 |
2021/01/28(木) 02:47:34.69ID:ggjwGOj3
CやUnix、オブジェクト指向なんかよりもはるかに古いんだよな
最初に実装されたのはlispかな
メモリを食いすぎるのでおもちゃしか動かなかったようだが
0894デフォルトの名無しさん
垢版 |
2021/01/29(金) 03:09:35.61ID:5NtPwDh4
今の時代メモリ食いすぎても動くし遅くもならないよな
1億再帰とかやったら話は別だけど
0895デフォルトの名無しさん
垢版 |
2021/07/16(金) 14:24:10.16ID:S3gddm5/
>>890

要らない

/* n の階乗を求める */
int fact(int n)
{
 if(n==0){
  return 1;
 } else {
  return fact(n-1);
 }
}

実質ループする処理だけど、ループの回数数えるための
変数は一切出現しない。なおかつ n は不変。
レスを投稿する


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