トップページ⇒tech
1002コメント380KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2015/09/06(日) 17:35:49.88ID:8kAWPtv+
再帰とは何か?

http://ews2.cc.niigata-u.ac.jp/~takeuchi/tbasic/BackGround/Recursive.html

★再帰を使わない例
この階乗関数を Basic プログラムとして実現してみると,
(Tiny Basic には階乗関数 Factorial が内蔵されていますから,
実際にこのようなプログラムを書く必要はありませんが。)

Function Kaijyou(n)
If n = 0 then
Kaijyou = 1
Else
Kaijyou = Kaijyou(n-1)*n
End if
End Function

となります。しかし,実は階乗関数は,再帰を使わなくても,
次のように実現することが出来ます。

Function Kaijyou(n)
F = 1
For i = 1 to n
F = F * i
Next i
Kaijyou = F
End Function

↑再帰を使わなくても,次のように実現することが出来ます。
0232デフォルトの名無しさん2015/09/09(水) 09:29:21.72ID:1Ou1EL3T
別になんでもええよ
最低限意味が通れば
0233NAS6 ◆n3AmnVhjwc 2015/09/09(水) 11:27:53.92ID:C2LbPxwf
>>231
それでは、未開部族の中に放り込まれたとき、知識は、正しくなくなるのですね?
0234デフォルトの名無しさん2015/09/09(水) 11:51:03.94ID:OjqvIpm4
詭弁の特徴のガイドライン
2.ごくまれな反例をとりあげる
「それでは、未開部族の中に放り込まれたとき、知識は、正しくなくなるのですね?」
0235NAS6 ◆n3AmnVhjwc 2015/09/09(水) 12:58:03.11ID:C2LbPxwf
では、まれでもない反例

・瀉血、割礼など、悪習が正しい方法とされている場合がある
0236デフォルトの名無しさん2015/09/09(水) 13:01:57.46ID:OjqvIpm4
>>235
まれな反例なんだが
先進国で瀉血、割礼なんかやってるか?
お前頭悪いっしょ
0237デフォルトの名無しさん2015/09/09(水) 13:22:36.93ID:1Ou1EL3T
もういいから。どうでも。
0238デフォルトの名無しさん2015/09/09(水) 13:24:34.06ID:qa+GQBo1
たしかに飽きてきたなw

まあここまで遊べたし、
ね?スレ立てた意味あったでしょ?w
0239デフォルトの名無しさん2015/09/09(水) 13:26:40.64ID:yEdJqNkn
>>231
天動説信じてる未開人が現代に紛れ込んだ事を言いたかったんだろうが、
未開人につけ込まれる、脇のあまさ。
お前バカなんだから、引っ込んでろ。
0240デフォルトの名無しさん2015/09/09(水) 13:29:04.69ID:qa+GQBo1
ん? 誰か反論でもしたっけ?
0241デフォルトの名無しさん2015/09/09(水) 13:29:31.14ID:qa+GQBo1
まさか、見るからに明らかな詭弁の話してる?
0242NAS6 ◆n3AmnVhjwc 2015/09/09(水) 15:04:03.16ID:C2LbPxwf
>>236
世間知らず
0243デフォルトの名無しさん2015/09/09(水) 16:14:26.05ID:E/sI2eG1
>>239
お前前にもいたよな
もしかしてNAS6が他の所から書き込んで自己弁護してる?

>>241
NAS6は馬鹿なのに詭弁強弁が通ると思ってる甘ちゃん
そんな馬鹿いくらでも見てきたけどNAS6は最弱の部類ですよ

>>242
ニートに言われたくないなあ
0244デフォルトの名無しさん2015/09/09(水) 17:17:18.80ID:yEdJqNkn
>>243
なんで、あれがNASの擁護になるんだよ。
バカの思考回路は理解不能だわ。
0245デフォルトの名無しさん2015/09/09(水) 19:03:02.63ID:FLIFW6sl
俺も多数派が常に正しい、という考えは間違ってると思うよ
それこそ詭弁
0246デフォルトの名無しさん2015/09/09(水) 19:32:08.27ID:qa+GQBo1
正しいかどうかじゃなくて、
言葉の定義だから。

たった一人しか同意してない
言葉の定義に意味は無いw
0247NAS6 ◆n3AmnVhjwc 2015/09/09(水) 20:26:13.33ID:C2LbPxwf
>>246
大辞林だよ?

大辞林 第三版の解説
さいきてき【再帰的】
�@自己の行為の結果が自己に戻ってくること。フィードバック。
�A(数学などで)定義の中に定義されるものが含まれていること。
0248デフォルトの名無しさん2015/09/09(水) 20:26:36.08ID:PucPC3VB
詭弁のガイドラインw
何の権威もないもので権威付けする前に少しは自分で考える力をつけたらどうだ?
0249デフォルトの名無しさん2015/09/09(水) 20:30:42.52ID:wWdkHka6
>>248
権威付けなんかしてないんだが
ほう、お前は権威付けが好きみたいだな
日頃からそういうのやってるのか?
0250デフォルトの名無しさん2015/09/09(水) 20:31:09.71ID:VSpGV/fr
>>247
それと同じ理屈で継承じゃないものを
継承っていいそうだなw

例外も大辞林もってきて、
これが「例外」だとかいいそうw

えとさぁ。プログラミング用語の話だってわかってる?w
0251NAS6 ◆n3AmnVhjwc 2015/09/09(水) 20:31:40.60ID:C2LbPxwf
ああ、あれか
「再帰関数のみが再帰」って言っている奴が
たった一人で自演をしているだけだから
自分で自分のことを言ってるだけか・・・
0252デフォルトの名無しさん2015/09/09(水) 20:33:32.78ID:VSpGV/fr
>>251
なんで一人だと思ったの?w
ID違うでしょ。
0253デフォルトの名無しさん2015/09/09(水) 20:34:29.80ID:PucPC3VB
>>249
じゃあなんで「詭弁のガイドラインによると詭弁である」かのような書き込みをしたの?
自分で何をやろうとしてたか理解できてない?
0254デフォルトの名無しさん2015/09/09(水) 20:36:49.00ID:VSpGV/fr
いつから「詭弁のガイドライン」が権威になったのだろうか?

あれは、詐欺もしくは詐欺まがいの書き込みに
だまされないようにするための注意だろう?
0255NAS6 ◆n3AmnVhjwc 2015/09/09(水) 20:38:00.20ID:C2LbPxwf
>>250
別にどうでもいいんだが

throw 〜 catch
で例外は当然だろ

で
if(!n)
if(n==nullptr)
if(n==undefined)
こういうのも例外に含むかどうかなんて、そいつの好みだろ
0256デフォルトの名無しさん2015/09/09(水) 20:39:19.64ID:VSpGV/fr
新しい釣り来たなw

if(!n)

これが「例外」だとさ
苦笑(大笑い)
0257デフォルトの名無しさん2015/09/09(水) 20:42:33.03ID:PucPC3VB
ID:VSpGV/fr
酔ってるのか?
落ち着いてレスしな
0258NAS6 ◆n3AmnVhjwc 2015/09/09(水) 20:43:14.67ID:C2LbPxwf
再帰関数のみが再帰なんだったら
if(!n)
if(n==nullptr)
if(n==undefined)
は例外処理ではなくて
try 〜 throw 〜 catch
asseert
くらいしかないんだろ
0259NAS6 ◆n3AmnVhjwc 2015/09/09(水) 20:45:09.88ID:C2LbPxwf
>>256
ゼロ除算なんて例外の基本の基本
0260デフォルトの名無しさん2015/09/09(水) 20:50:20.46ID:YdXDVCj1
ん?
ここは再帰関数のスレではなく、「『再帰的』とは何か?」のスレだったの?
0261NAS6 ◆n3AmnVhjwc 2015/09/09(水) 20:54:34.58ID:C2LbPxwf
1 :デフォルトの名無しさん:2015/09/06(日) 17:35:49.88 ID:8kAWPtv+
再帰とは何か?

略
0262デフォルトの名無しさん2015/09/09(水) 20:59:33.74ID:FLIFW6sl
権威付けによる強弁はスレの最初の方がひどい
0263デフォルトの名無しさん2015/09/09(水) 21:00:02.70ID:YdXDVCj1
そしたら金田一先生に訊くのが一番だよ。
0264デフォルトの名無しさん2015/09/09(水) 21:17:44.99ID:z4+LRm4z
おまえら本当にすきなの?
再帰なんてStack overflowの元凶だろ?
業務アプリで使うとかありえないと思うんだが。
0265NAS6 ◆n3AmnVhjwc 2015/09/09(水) 21:19:33.67ID:C2LbPxwf
例えば、
D社から買ってA社はB社に売る
A社から買ってB社はC社に売る
B社から買ってC社はD社に売る
C社から買ってD社はA社に売る
と、個々の会社は俺は違うと思っていても
循環取引のサイクルの中に
知らずに取り込まれている場合がある

こういう、「迷惑の発明」こそ詭弁の中の詭弁
0266デフォルトの名無しさん2015/09/09(水) 21:24:20.99ID:0S5pZc99
>>264
じゃあループは無限ループの元凶だから
使うべきじゃないってことになるし、
パンツはパンツ泥棒の元凶ってことになるよね。
でもパンツ履くだろ?そういうことだ。
0267デフォルトの名無しさん2015/09/09(水) 21:26:28.21ID:V9adpqxF
たまーにWindowsのメッセージ呼び出しが再帰になってて無限ループでフリーズする。
製作途中だけどね
0268デフォルトの名無しさん2015/09/09(水) 21:31:04.01ID:4Pix0Avf
>>267
メッセージ呼び出しが再帰っていうのは、
メッセージダイアログが、さらにメッセージダイアログを出して、
そのダイアログがさらに、ダイアログを出すってことか?

メッセージダイアログを閉じても
同じものが出るのは再帰じゃないな。
単なる無限ループ。
0269NAS6 ◆n3AmnVhjwc 2015/09/09(水) 21:33:53.94ID:C2LbPxwf
ttp://ja.wikipedia.org/wiki/%E5%9B%BD%E9%9A%9B%E9%87%91%E8%9E%8D%E3%81%AE%E3%83%88%E3%83%AA%E3%83%AC%E3%83%B3%E3%83%9E
国際金融のトリレンマ

トリ(X)レンマになるのは
循環論の「迷惑の発明」状態だから
0270デフォルトの名無しさん2015/09/09(水) 21:35:25.40ID:V9adpqxF
あるハンドラがSendMsseageで送った先で再び同じハンドラを呼び出すメッセージを呼べば再帰になるよ。
PostMessageなら違うが
0271NAS6 ◆n3AmnVhjwc 2015/09/09(水) 21:46:56.85ID:C2LbPxwf
>>270
プログラミングの設計思想として相互依存関係は
循環論になるから出来得る限り排除するのが普通だけどな
0272NAS6 ◆n3AmnVhjwc 2015/09/09(水) 21:50:55.62ID:C2LbPxwf
>>270
は、再帰が悪いのではなく、相互依存関係の構造が悪い
0273デフォルトの名無しさん2015/09/09(水) 22:50:01.10ID:4Pix0Avf
>>272
どこに再帰が悪いって書いてあるんだ?
0274デフォルトの名無しさん2015/09/09(水) 22:59:43.97ID:bdykH7Ti
近年相次いだ大型航空機失踪事故の原因も、突き詰めれば再帰が原因じゃないかと
疑っているんだがな。
0275NAS6 ◆n3AmnVhjwc 2015/09/10(木) 03:52:11.61ID:i4fz0MOQ
>>272
>>267
0276NAS6 ◆n3AmnVhjwc 2015/09/10(木) 03:53:00.64ID:i4fz0MOQ
アンカミス
>>273
>>267
0277Akishino Reeks☆[転載禁止]2ch.net2015/09/10(木) 22:20:55.21ID:bnJhddUC
○_____
|       |
|   ●  |
|_____|
|
|
Σ(Д・;)『佳子さま』に『スキャンダル!!』 ★***暴露情報!!***
■『男性と"お付き合い"』も、そろそろあると、皆様お察しの事でしょう。
■そうなんです!!「男性との"お付き合い"」
■・・・いや、【"お突き合い"】のお話が、急浮上です!!
■知られざる『佳子さま』の「男性事情」が明らかに!!

※下記を『Google』か『Yahoo』で検索して下さい。
↓↓↓検索キーワード↓↓↓
『眞子さま かれし』       ←漢字変換  
『佳子さま 眞子さま かれし』  ←漢字変換
『眞子様 かれし』        ←漢字変換

★上記で検索しますと、『1ページ目』か『2ページ目』あたりに、
【婚約】秋條宮家の佳子様と眞子様・・・・・・・・【結婚】
↑↑↑が表示されます。
※留学中にクラブに出入りしたり不特定多数の男性と関係を持った詳細まで……。
★★★★★★★★★★★★★★★★★★★★
https://sites.google.com/site/kimitujyouhou
0278デフォルトの名無しさん2015/09/10(木) 23:55:58.43ID:TaFnpRYE
>>266
全然違うだろ
ループは条件が正しければ抜ける
再帰は条件が正しくても抜ける前にStack Overflowを起こす。
0279デフォルトの名無しさん2015/09/11(金) 00:14:56.08ID:l/LuS5UK
>>278
一度試せば何回関数呼べるのかわかるでしょうが。
それに多少のバッファ持たせて再帰がこれだけ
深くなったら処理を打ち切るって条件かませばいいでしょうが。
何でもかんでも再帰にすればいいと言ってんじゃないよ。
なんでもかんでも包丁でかっさばけばいいわけじゃない。
プログラミング界の天才外科医として俺はそういうのは許せない。
0280デフォルトの名無しさん2015/09/11(金) 00:34:41.08ID:7563jNLz
末尾再帰にすれば最適化されるだろっての
0281デフォルトの名無しさん2015/09/11(金) 06:28:21.76ID:09P0zO5B
末尾再帰になっており、かつ末尾最適化
される言語においてはループに変換される。

そのような最適化を行わないでコードのとおりに
実行すればスタックオーバーフローになる。
0282デフォルトの名無しさん2015/09/11(金) 06:29:17.38ID:09P0zO5B
>>279
> それに多少のバッファ持たせて再帰がこれだけ
> 深くなったら処理を打ち切るって条件かませばいいでしょうが。

えぇ、それがスタックオーバーフローだよw
スタックオーバーフローという例外になって処理が打ち切られるから
答えを出すことが出来ない。
0283デフォルトの名無しさん2015/09/11(金) 08:51:23.71ID:5NOK/0qB
基本的なことで申し訳無いけど誰か教えて。
末尾呼び出し最適化って、try catch で囲んでもちゃんと効くものなの?
それとも、try catch に入れた時点で最早末尾呼び出しではない?
0284デフォルトの名無しさん2015/09/11(金) 12:15:28.87ID:0KyqNxdA
どんな言語使ってるか知らないけど、この辺りが参考になるかな。

http://d.hatena.ne.jp/leque/20121202/p1
http://www.ymotongpoo.com/works/lyse-ja/ja/09_errors_and_exceptions.html

使ってる処理系のマニュアル読んだ方がいいと思うけどね。
0285デフォルトの名無しさん2015/09/11(金) 14:07:52.08ID:bvB8mHVh
>>281 ループに決して書き換わることのないインタプリタだって、
末尾再帰呼び出しの最適化は働く場合もある。
0286デフォルトの名無しさん2015/09/11(金) 18:51:12.07ID:G0A8z2XG
>>279
その甘い考えが、急加速する自動車や太平洋上で消息を絶つ航空機につながったのではないだろうか。
0287デフォルトの名無しさん2015/09/11(金) 18:53:51.95ID:G0A8z2XG
ツリートラバースを行うイテレータについて考えてみよう。
再帰に拘る原始人の愚かさがわかるであろう。
0288デフォルトの名無しさん2015/09/11(金) 20:06:44.64ID:vI/Sge8p
>>286
ミッションクリティカルなところは確実性が必要だ、としか言ってないよねそれ

それ以外の部分まで何でもかんでもループにこだわるのは時代遅れもいいところ
0289デフォルトの名無しさん2015/09/11(金) 20:18:50.37ID:NZsxm6a9
 
http://moro2222.blog.fc2.com/blog-entry-1352.html

痴女wwwwwwwwwwwwww
  
0290デフォルトの名無しさん2015/09/11(金) 20:28:39.45ID:5NOK/0qB
>>284
サンクス。ざっと眺めただけだけど、try の中に入れた時点で末尾呼び出しではないことが分かった。
外側で catch するしかないのね。
0291デフォルトの名無しさん2015/09/11(金) 21:01:10.34ID:G0A8z2XG
>>288
再帰はモジュール化に劣る。
いまどき再帰なんて使わないよ、この原始人め。

そもそもセキュリティ勧告で常に上位に来る再帰による危険性をわざわざ
使う理由が無い。
0292デフォルトの名無しさん2015/09/11(金) 21:04:02.82ID:G0A8z2XG
「先生!ゆうくんが再帰使ってます!」って告げ口されちゃう時代だぞ。
お前小学生に負けてるじゃねーか。
0293デフォルトの名無しさん2015/09/11(金) 21:11:00.99ID:V5+3K+4n
>>292
どういう意味?
0294デフォルトの名無しさん2015/09/11(金) 21:43:46.78ID:vI/Sge8p
>>291
セキュリティ勧告?どこの?
具体的に出してみて
0295デフォルトの名無しさん2015/09/12(土) 06:47:21.20ID:o99yCw3m
後藤論争なんてものもあったが、gotoは使い道があるわけ。

再帰なんて危険なだけで使い道のない初心者用の手抜きだろ。

再帰を禁止しないという事は、そういう会社ってこと。
取引を停止したほうが良い。
0296NAS6 ◆n3AmnVhjwc 2015/09/12(土) 08:26:09.58ID:u3wwvrmv
これは、俺は再帰的だと読むけど、お前らはループ的だと読むのか?
class tree{
public:
 tree* parent;//rootのparentはnullptr
 tree* chlid[];//説明の便宜上
 int childsize;
...
};
//終了検知
bool end(tree* root, tree* v, int i, bool& b){
 return ((b || !v->childsize) && v == root && v->childsize <= i)
}
//次の順番のノードを返す
tree* next(tree* v, int i, bool& b){
 if(v->childsize <= i) { b = true; return v->parent; }
 return v->child[i];
}
//ノード処理
tree* nodefunc(tree* root, tree* v)
{
 int i = 0;
 bool b = false;
 while(!end(root, v, i, b)){
  i += 1;
  b = false;
  v = next(v, i ,b);
  if(!b){//v:子ノード処理}
  else{//v:親ノード処理}
 }
}
0297NAS6 ◆n3AmnVhjwc 2015/09/12(土) 08:30:01.75ID:u3wwvrmv
//iの順番のノードを返す
tree* ith_child(tree* v, int i, bool& b){
 if(v->childsize <= i) { b = true; return v->parent; }
 return v->child[i];
}
//ノード処理
tree* nodefunc(tree* root, tree* v)
{
 int i = 0;
 bool b = false;
 while(!end(root, v, i, b)){
  i += 1; //次のノード
  b = false;
  v = ith_child(v, i ,b);
  if(!b){//v:子ノード処理}
  else{//v:親ノード処理}
 }
}
0298NAS6 ◆n3AmnVhjwc 2015/09/12(土) 08:35:55.80ID:u3wwvrmv
訂正
class tree{
public:
 tree* parent;//rootのparentはnullptr
 tree* chlid[];//説明の便宜上
 int childsize;
...
};
//終了検知
bool end(tree* root, tree* v, int i, bool& b){
 return ((b || !v->childsize) && v == root && v->childsize <= i)
}
//iの順番のノードを返す
tree* ith_child(tree* v, int i, bool& b){
 if(v->childsize <= i) { b = true; return v->parent; }
 return v->child[i];
}
//ノード処理
tree* nodefunc(tree* root, tree* v)
{
 int i = 0;
 bool b = false;
 //最初のノード処理
 while(!end(root, v, i, b)){
  i += 1; //次のノード b = false;
  v = ith_child(v, i ,b);
  if(!b){//v:子ノード処理}
  else{//v:親ノード処理}
 }
 return v;
}
0299NAS6 ◆n3AmnVhjwc 2015/09/12(土) 08:42:22.01ID:u3wwvrmv
訂正
class tree{
public:
 tree* parent;//rootのparentはnullptr
 tree* chlid[];//説明の便宜上
 int childsize;
...
};
//終了検知
bool end(tree* root, tree* v, int i, bool& b){
 return ((b || !v->childsize) && v == root && (i < 0 || v->childsize <= i))
}
//iの順番のノードを返す
tree* at(tree* v, int i, bool& b){
 if(i < 0 || v->childsize <= i) { b = true; return v->parent; }
 return v->child[i];
}
//ノード処理
tree* nodefunc(tree* root, tree* v)
{
 int i = 0;
 bool b = false;
 //最初のノード処理
 while(!end(root, v, i, b)){
  i += 1; //次のノード b = false;
  v = at(v, i ,b);
  if(!b){//v:子ノード処理}
  else{//v:親ノード処理}
 }
 return v;
}
0300NAS6 ◆n3AmnVhjwc 2015/09/12(土) 08:53:36.58ID:u3wwvrmv
訂正 //iをpushしないとダメか
class tree{
public:
 tree* parent;//rootのparentはnullptr
 tree* chlid[];//説明の便宜上
 int childsize;
 int crnt;//i
...
};
//終了検知
bool end(tree* root, tree* v, bool& b){
 return ((b || !v->childsize) && v == root && (v->crnt < 0 || v->childsize <= v->crnt))
}
//crntの順番のノードを返す
tree* at(tree* v, bool& b){
 if(v->crnt < 0 || v->childsize <= v->crnt) { b = true; return v->parent; }
 return v->child[v->crnt];
}
//ノード処理
tree* nodefunc(tree* root, tree* v)
{
 crntzero();//v以下のcrntを全てゼロ初期化処理:詳細は省略
 bool b = false;
 //最初のノード処理
 while(!end(root, v, b)){
  v->crnt += 1; //次のノード b = false;
  v = at(v, b);
  if(!b){//v:子ノード処理}
  else{//v:親ノード処理}
 }
 return v;
}
0301NAS6 ◆n3AmnVhjwc 2015/09/12(土) 08:57:33.49ID:QD0G+9W6
>>300
は、再帰的処理か?ループ的処理か?
0302NAS6 ◆n3AmnVhjwc 2015/09/12(土) 09:11:43.86ID:QD0G+9W6
訂正 : これは再帰的だろ
class tree{
public:
 tree* parent;//rootのparentはnullptr
 tree* chlid[];//説明の便宜上
 int childsize;
 int crnt;//子ノード指示変数
...
 //終了検知
 bool end(tree* root, bool& b){
  return ((b || !childsize) && this == root && (crnt < 0 || childsize <= crnt))
 }
 //crntの順番のノードを返す
 tree* crntchild(bool& b){
  if(crnt < 0 || childsize <= crnt) { b = true; return parent; }
  return child[crnt];
 }
};
//ノード処理
tree* nodefunc(tree* root, tree* v)
{
 crntzero(v);//v以下のcrntを全てゼロ初期化処理:詳細は省略
 bool b = false;
 //最初のノード処理
 while(!v->end(root, b)){
  v->crnt += 1; //次のノード b = false;
  v = v->crntchild(b);
  if(!b){//v:子ノード処理}
  else{//v:親ノード処理}
 }
 return v;
}
0303デフォルトの名無しさん2015/09/12(土) 09:14:29.84ID:SayI8MOx
ながながと書いている所悪いが、
それは再帰とは言わない。
0304NAS6 ◆n3AmnVhjwc 2015/09/12(土) 09:18:51.51ID:u3wwvrmv
コンパイラ通してないからミスばっかしでゴメン
//root以下のノード処理
tree* nodefunc(tree* root)
{
 crntzero(root);//root以下のcrntを全てゼロ初期化処理:詳細は省略
 tree* v = root;
 bool b = false;
 //最初のノード処理
 while(!v->end(root, b)){
  v->crnt += 1; //次のノード b = false;
  v = v->crntchild(b);
  if(!b){//v:子ノード処理}
  else{//v:親ノード処理}
 }
 return v;
}
0305NAS6 ◆n3AmnVhjwc 2015/09/12(土) 09:21:14.87ID:u3wwvrmv
>>303
再帰関数は使ってないけど、処理自体は再帰的処理そのものだよ
0306デフォルトの名無しさん2015/09/12(土) 09:22:04.63ID:6uN+DXZM
#include <stdio.h>

int IAbs(int x);
void Parity(int x);
void main(void);

/* 絶対値を返す */
int IAbs(int x)
{
return ((x >= 0)? x : -x);
}

/* 奇数か偶数かを表示する */
void Parity(int x)
{
printf("%s", (x % 2)? "奇数" : "偶数");
}

void main(void)
{
int n;

printf("整数を入力して下さい ");
scanf("%d", &n);
printf("その数の絶対値は %d です。\n", IAbs(n));
printf("それは");
Parity(n);
printf("です。");
}
0307デフォルトの名無しさん2015/09/12(土) 09:22:56.89ID:6uN+DXZM
#include <stdio.h>
int BubSort(int x[ ], int n);
void ShowData(int x[ ], int n);
void main(void);
#define NUM_DATA 10 /* ソートするデータの数 */
int x[ ] = {9, 4, 6, 2, 1, 8, 0, 3, 7, 5}; /* このデータをソート */
/* バブルソートを行う */
int BubSort(int x[ ], int n)
{
int i, j, temp;

for (i = 0; i < n - 1; i++) {
for (j = n - 1; j > i; j--) {
if (x[j - 1] > x[j]) { /* 前の要素の方が大きかったら */
temp = x[j]; /* 交換する */
x[j] = x[j - 1];
x[j - 1]= temp;
}
}
/* ソートの途中経過を表示 */
ShowData(x, NUM_DATA);
}
}

/* ソート対象のデータを表示 */
void ShowData(int x[ ], int n)
{
int i;

for (i = 0; i < n ; i++)
printf("%d\t", x[i]);
}
0308デフォルトの名無しさん2015/09/12(土) 09:23:26.20ID:6uN+DXZM
void main(void)
{
/* ソート前のデータを表示 */
printf("ソート前:\n");
ShowData(x, NUM_DATA);
printf("\n\n");

BubSort(x, NUM_DATA);

/* ソート後のデータを表示 */
printf("\n\nソート後:\n");
ShowData(x, NUM_DATA);
}

include <stdio.h>
#define NUM_DATA 8
void InsSort(int num[ ], int n) ;
void ShowData(int num[ ], int n);
void main(void);
/* n 個のデータの単純挿入ソートを行う */
void InsSort(int num[ ], int n)
{
int i, j, temp;

for (i = 1; i < n; i++) { /* i 番目の要素をソート済みの配列に挿入 */
temp = num[i]; /* i 番目の要素を temp に保存 */
for (j = i; j > 0 && num[j-1] > temp; j--) /* このループで */
num[j] = num[j -1]; /* temp を挿入する位置を決める */
num[j] = temp; /* temp を挿入 */
ShowData(num, NUM_DATA); /* 途中経過を表示 */
}
}
0309デフォルトの名無しさん2015/09/12(土) 09:24:00.26ID:6uN+DXZM
/* n 個のデータを表示 */
void ShowData(int num[ ], int n)
{
while (n--)
printf("%d ", *num++);
printf("\n");
}
void main(void)
{
/* ソート対象のデータ */
int num[ ] = {3, 7, 1, 5, 4, 2, 6, 0};

/* ソート前のデータの表示 */
printf("ソート前: ");
ShowData(num, NUM_DATA);
printf("\n");

/* ソート */
InsSort(num, NUM_DATA);
printf("\n");
/* ソート後のデータの表示 */
printf("ソート後: ");
ShowData(num, NUM_DATA);
printf("\n");
}
#include <stdio.h>
#include <string.h> /* strcmp( )に必要 */
#define NUM_DATA 10 /* ソートするデータ数 */
/* ソート対象の文字列へのポインタの配列 */
char *animal[NUM_DATA] = {"Cat", "Dog", "Tiger", "Bug", "Bird",
"Fish", "Seep", "Cow", "Pig", "Rat"
};
0310デフォルトの名無しさん2015/09/12(土) 09:24:28.01ID:6uN+DXZM
void StrSort(char *str[ ], int n);
void main(void);

/* n個の文字列をソート */
void StrSort(char *str[ ], int n)
{
int i, j, k;
char *temp; /* 作業用ポインタ */

for (i = 0; i < n - 1; i++) {
for (j = i + 1; j < n; j++) {
if ((strcmp(str[j], str[i])) < 0) {
temp = str[i]; /* 作業用ポインタを使い */
str[i] = str[j]; /* i + 1番目に小さい要素と */
str[j] = temp; /* str[i] の要素と交換 */
}
}
for (k = 0; k < n; k++) /* ソートの途中経過を表示 */
printf("%s ", str[k]);
printf("\n");
}
}
0311デフォルトの名無しさん2015/09/12(土) 09:25:11.15ID:/jNm+UV1
#include <stdio.h>

#define NUM_DATA 8

void SimSelSort(int num[ ], int n) ;
void ShowData(int num[ ], int n);
void main(void);

/* n 個のデータの単純選択ソートを行う */
void SimSelSort(int num[ ], int n)
{
int i, j, k, min, temp;

for (i = 0; i < n - 1; i++) {
min = num[i]; /* i 番目の要素を暫定的に最小値とし */
k = i; /* 添字を保存 */
for (j = i + 1; j < n; j++) {
if (num[j] < min) { /* より小さい値が現れたら */
min = num[j]; /* 最小値の入れ替え */
k = j; /* 添字を保存 */
}
} /* このループを抜けるとk に最小値の添字が入っている */
temp = num[i]; /* i 番目の要素と最小値の交換 */
num[i] = num[k];
num[k] = temp;
ShowData(num, NUM_DATA);
}
}
0312デフォルトの名無しさん2015/09/12(土) 09:25:44.37ID:/jNm+UV1
tree* ith_child(tree* v, int i, bool& b){
 if(v->childsize <= i) { b = true; return v->parent; }
 return v->child[i];
}
//ノード処理
tree* nodefunc(tree* root, tree* v)
{
 int i = 0;
 bool b = false;
 while(!end(root, v, i, b)){
  i += 1; //次のノード
  b = false;
  v = ith_child(v, i ,b);
  if(!b){//v:子ノード処理}
  else{//v:親ノード処理}
 }
}
0313デフォルトの名無しさん2015/09/12(土) 09:26:00.47ID:/jNm+UV1
//終了検知
bool end(tree* root, tree* v, int i, bool& b){
 return ((b || !v->childsize) && v == root && v->childsize <= i)
}
//次の順番のノードを返す
tree* next(tree* v, int i, bool& b){
 if(v->childsize <= i) { b = true; return v->parent; }
 return v->child[i];
}
//ノード処理
tree* nodefunc(tree* root, tree* v)
{
 int i = 0;
 bool b = false;
 while(!end(root, v, i, b)){
  i += 1;
  b = false;
  v = next(v, i ,b);
  if(!b){//v:子ノード処理}
  else{//v:親ノード処理}
 }
}
0314デフォルトの名無しさん2015/09/12(土) 09:26:32.64ID:/jNm+UV1
class tree{
public:
 tree* parent;//rootのparentはnullptr
 tree* chlid[];//説明の便宜上
 int childsize;
...
};
//終了検知
bool end(tree* root, tree* v, int i, bool& b){
 return ((b || !v->childsize) && v == root && (i < 0 || v->childsize <= i))
}
//iの順番のノードを返す
tree* at(tree* v, int i, bool& b){
 if(i < 0 || v->childsize <= i) { b = true; return v->parent; }
 return v->child[i];
}
//ノード処理
tree* nodefunc(tree* root, tree* v)
{
 int i = 0;
 bool b = false;
 //最初のノード処理
 while(!end(root, v, i, b)){
  i += 1; //次のノード b = false;
  v = at(v, i ,b);
  if(!b){//v:子ノード処理}
  else{//v:親ノード処理}
 }
 return v;
}
0315デフォルトの名無しさん2015/09/12(土) 09:26:50.60ID:/jNm+UV1
/* n 個のデータを表示 */
void ShowData(int num[ ], int n)
{
while (n--)
printf("%d ", *num++);
printf("\n");
}

void main(void)
{
/* ソート対象のデータ */
int num[ ] = {8, 7, 6, 5, 4, 3, 2, 1};

/* ソート前のデータの表示 */
printf("ソート前: ");
ShowData(num, NUM_DATA);
printf("\n");

/* ソート */
SimSelSort(num, NUM_DATA);
printf("\n");

/* ソート後のデータの表示 */
printf("ソート後: ");
ShowData(num, NUM_DATA);
printf("\n");
}
0316デフォルトの名無しさん2015/09/12(土) 09:27:37.42ID:96TVgXwJ
#include <stdio.h>
#define NUM_DATA 8
void ShellSort(int num[ ], int n) ;
void InsSort(int num[ ], int gap, int n);
void ShowData(int num[ ], int n);
void main(void);

/* n 個のデータのシェルソートを行う */
void ShellSort(int num[ ], int n)
{
int gap;
for (gap = n / 2; gap > 0; gap /= 2)
InsSort(num, gap, n);
}
/* n 個のデータの単純挿入ソートを行う */
void InsSort(int num[ ], int gap, int n)
{
int i, j, temp;
for (i = gap; i < n; i ++) {
for (j = i - gap; j >= 0; j -= gap) { /* このループで */
if (num[j] <= num[j + gap]) /* j 番目とj + gap 番目と比較 */
break; /* ここにbreak;を挿入。H.O.さんご指摘ありがとうございました。 */
else {
temp = num[j]; /* 要素の入れ替え */
num[j] = num[j + gap];
num[j + gap] = temp;
ShowData(num, NUM_DATA); /* 途中経過を表示 */
}
}
}
printf("\n"); /* InsSort( ) を抜ける時改行 */
}
0317NAS6 ◆n3AmnVhjwc 2015/09/12(土) 09:29:10.11ID:u3wwvrmv
こういう処理は
ループ的に説明するより、再帰的に説明した方が
分かりやすいんだけど
0318デフォルトの名無しさん2015/09/12(土) 09:30:14.33ID:96TVgXwJ
#include <stdio.h>
void RadixSort(int x[ ], int n, int r);
void ShowData(int x[ ], int n);
void main(void);
#define NUM_DATA 10
static int rad[NUM_DATA]; /* 基数をしまう配列 */
static int y[NUM_DATA]; /* 作業用配列 */
/* 基数ソートを行う */
void RadixSort(int x[ ], int n, int r) /* x[ ]:ソートするデータ */
{ /* n:データの数 */
int i, j, k; /* r:基数を取り出す最大値 */
int m = 1; /* 基数を取り出す桁 */
while (m <= r) {
for (i = 0; i < n; i++)
rad[i] = (x[i] / m) % 10; /* 基数を取り出し rad[i] に保存 */

k = 0; /* 配列の添字として使う */
for (i = 0; i <= 9; i++) /* 基数は 0 から 9 */
for (j = 0; j < n; j++)
if (rad[j] == i) /* 基数の小さいものから */
y[k++] = x[j]; /* y[ ] にコピー */

for (i = 0; i < n; i++)
x[i] = y[i]; /* x[ ] にコピーし直す */

/* 途中経過を表示 */
printf("\nソート中:\n");
ShowData(x, n);

m *= 10; /* 基数を取り出す桁を一つ上げる */
}
}
0319デフォルトの名無しさん2015/09/12(土) 09:30:27.18ID:96TVgXwJ
/* n 個のデータを表示する */
void ShowData(int x[ ], int n)
{
int i;

for (i = 0; i < n ; i++)
printf("%d\t", x[i]);
}

void main(void)
{ /* ソートするデータ */
int x[NUM_DATA] = { 5489, 1473, 7853, 1058, 9448,
1118, 7979, 2163, 1856, 3117
};
int n = 10; /* ソートするデータ数 */
int r = 1000; /* ソートするデータから取り出す基数の上限 */

/* ソート前のデータを表示 */
printf("ソート前:\n");
ShowData(x, n);
printf("\n");

RadixSort(x, n, r);

/* ソート後のデータを表示 */
printf("\n\nソート後:\n");
ShowData(x, n);
}
0320デフォルトの名無しさん2015/09/12(土) 09:30:56.98ID:96TVgXwJ
#include <stdio.h>
#define MAX_DATA 10
int temp[MAX_DATA]; /* 最小でも配列と同じサイズの領域が必要 */
void MergeSort(int x[ ], int left, int right);
void main(void);
/* 配列 x[ ] の left から right の要素のマージソートを行う */
void MergeSort(int x[ ], int left, int right)
{
int mid, i, j, k;
if (left >= right) /* 配列の要素がひとつなら */
return; /* 何もしないで戻る */
/* ここでは分割しているだけ */
mid = (left + right) / 2; /* 中央の値より */
MergeSort(x, left, mid); /* 左を再帰呼び出し */
MergeSort(x, mid + 1, right); /* 右を再帰呼び出し */
/* x[left] から x[mid] を作業領域にコピー */
for (i = left; i <= mid; i++)
temp[i] = x[i];
/* x[mid + 1] から x[right] は逆順にコピー */
for (i = mid + 1, j = right; i <= right; i++, j--)
temp[i] = x[j];

i = left; /* i とj は作業領域のデーターを */
j = right; /* k は配列の要素を指している */

for (k = left; k <= right; k++) /* 小さい方から配列に戻す */
if (temp[i] <= temp[j]) /* ここでソートされる */
x[k] = temp[i++];
else
x[k] = temp[j--];
}
0321デフォルトの名無しさん2015/09/12(土) 09:31:13.83ID:96TVgXwJ
void main(void)
{
int i;
/* ソートされるデータ */
int x[ ] = {9, 4, 6, 2, 1, 8, 0, 3, 7, 5};

/* ソート前のデータを表示 */
printf("ソート前\n");
for (i = 0; i < MAX_DATA; i++)
printf("%d\t", x[i]);

MergeSort(x, 0, MAX_DATA - 1);

/* ソート後のデータを表示 */
printf("ソート後\n");
for (i = 0; i < MAX_DATA; i++)
printf("%d\t", x[i]);
}
0322NAS6 ◆n3AmnVhjwc 2015/09/12(土) 09:40:00.52ID:u3wwvrmv
>>306-316、は妨害、↓は再帰的に処理を説明した方がいい
class tree{
public:
 tree* parent;//rootのparentはnullptr
 tree* chlid[];//説明の便宜上
 int childsize; int crnt;//子ノード指示変数
...
 //終了検知
 bool end(tree* root, bool b){
  return ((b || !childsize) && this == root && (crnt < 0 || childsize <= crnt))
 }
 //crntの順番のノードを返す
 tree* crntchild(bool& b){
  if(crnt < 0 || childsize <= crnt) { b = true; return parent; }
  return child[crnt];
 }
};
//root以下のノード処理
void nodefunc(tree* root)
{
 crntzero(root);//root以下のcrntを全てゼロ初期化処理:詳細は省略
 tree* v = root; bool b = false;
 //最初のノード処理
 while(!v->end(root, b)){
  v->crnt += 1; //次のノード b = false;
  v = v->crntchild(b);
  if(!b){//v:子ノード処理}
  else{//v:親ノード処理}
 }
}
0323デフォルトの名無しさん2015/09/12(土) 09:51:06.51ID:38RTNor4
#include <stdio.h>

#define MAX_DATA 100
int Bin[MAX_DATA]; /* 作業用配列 */

void BinSort(int x[ ], int n);
void ShowData(int x[ ], int n);
void main(void);

/* ビンソートを行う */
void BinSort(int x[ ], int n)
{
int i, j;

if (n > MAX_DATA) {
printf("データが多すぎます!\n");
return;
}
else {
for (i = 0; i < MAX_DATA; i++)
Bin[i] = 0; /* 作業用配列の初期化 */

for (i = 0; i < n; i++) /* x[i] の値の */
Bin[x[i]]++; /* Bin[ ] の要素の値を */
/* インクリメント */
j = 0; /* x[ ] の添字として使用 */
for (i = 0; i < MAX_DATA ; i++)
if (Bin[i]) /* 0でなければ */
x[j++] = i; /* 書き戻す */
}
}
0324デフォルトの名無しさん2015/09/12(土) 09:52:04.12ID:XNUqiXhS
/* n 個のデータを表示する */
void ShowData(int x[ ], int n)
{
int i;

for (i = 0; i < n ; i++)
printf("%d\t", x[i]);
}


void main(void)
{
/* ソートするデータ */
int x[MAX_DATA] = {89, 1, 78, 58, 48, 18, 9, 21, 56, 11,
62, 23, 38, 96, 4, 45, 73,14, 30, 27,
6, 35, 2, 25, 69, 41, 8, 51, 0, 32,
98, 12, 33, 72, 19, 52, 28, 86, 17, 99
};
int n = 40; /* ソートするデータの数 */

/* ソート前のデータを表示 */
printf("ソート前:\n");
ShowData(x, n);
printf("\n");

BinSort(x, n);

/* ソート後のデータを表示 */
printf("\n\nAソート後:\n");
ShowData(x, n);
}
0325NAS6 ◆n3AmnVhjwc 2015/09/12(土) 09:54:18.33ID:u3wwvrmv
再帰関数のみが再帰的って言っている奴が発狂したか。。。
0326デフォルトの名無しさん2015/09/12(土) 09:57:28.02ID:BH7VjDv8
どっちでもいいからクソコード貼り付けるな
0327デフォルトの名無しさん2015/09/12(土) 11:00:15.81ID:/sFVAJJ4
>>295
いいからセキュリティ勧告がどれかさっさと示してね
0328デフォルトの名無しさん2015/09/12(土) 12:32:50.26ID:y43Wtzfc
上から目線レスしないでくれる?
個人の主張として批判せず、いたずらにある類として扱うのは極めて恣意的かおバカの批判にあらざる攻撃の特徴。
まあ、その軽蔑すべき発想で返した俺も反省はしてもよいが
はっきり言って精神病とバカの特徴でしかない論法でレスするなよ。
俺はバカと精神病きらいだからな。
おまえら、マジで精神病と思われる宣言的絶対主義の形而上学バカの一味は人類の公的な敵だとおもっているからな。
さしあたりお前らが馬鹿にされていることは科学的認識の健全性をそれなりに示すから喜ばしいがな。

それにしても、単なる知識を披露しあっているだけの時は頭良さそうなふりはできるが、
いよいよ自身の認識を問われる事態になるとここにいる連中、そこの浅さを露呈するやつ多すぎ
所詮、2chだな
0329NAS6 ◆n3AmnVhjwc 2015/09/12(土) 12:36:32.11ID:u3wwvrmv
>おまえら、マジで精神病と思われる宣言的絶対主義の形而上学バカの一味は人類の公的な敵だとおもっているからな。
まるで自分が人類の唯一の味方かのような書き込みですね
0330NAS6 ◆n3AmnVhjwc 2015/09/12(土) 12:59:14.49ID:u3wwvrmv
>>287
で、人類唯一の味方のお前は、何でツリートラバースが
再帰的処理をラッピングして、列挙しているとは思わないの?
>>322
のような処理ならば
ループ的に説明するより、再帰的に説明した方が話が通る
0331NAS6 ◆n3AmnVhjwc 2015/09/12(土) 14:00:59.20ID:u3wwvrmv
>宣言的絶対主義の形而上学

が、そんなに嫌なら
「基準を全く用いないこと」
で、何かの意味が分かりますか?
■ このスレッドは過去ログ倉庫に格納されています