底辺プログラマーだけど再起処理下手くそすぎてstackOverFlowばっか起こしてる

1: 2019/08/19(月) 11:05:56.498 ID:4Qkgtom9M
ながさ2nの数列からn個の要素を取り出すとしてその組み合わせを全部表示したいんだがどうすりゃstackOverFlowから逃れられるの…!
一流プログラマーvipper様教えてくれください…!

2: 2019/08/19(月) 11:09:29.584 ID:4Qkgtom9M
しにたい…

3: 2019/08/19(月) 11:11:42.072 ID:xwtiKPRs0
むしろどうやればスタックオーバーフローするのか教えてほしい

4: 2019/08/19(月) 11:12:57.552 ID:HabmYkkhM
仕事のコードで再起なんか書かない
GOTOと同じぐらいタブー

5: 2019/08/19(月) 11:14:48.202 ID:4Qkgtom9M
じゃあどうやって>>4を実装するの…
教えて…お願い…
つらいよ…悲しくて泣いちゃいそうなの…

6: 2019/08/19(月) 11:15:56.587 ID:4WW8E0Lr0
再起関数を forとかで書き換えられないの?(´・ω・`)

8: 2019/08/19(月) 11:17:59.989 ID:4Qkgtom9M
>>6
forでどうやって書けばいいのかわかんないよ…

組み合わせってこんな感じになっちゃうじゃん…
forじゃ書けないよきっと……
sssp://o.5ch.net/1ioje.png

9: 2019/08/19(月) 11:19:30.129 ID:4WW8E0Lr0
>>8
ifで条件分岐すればできるんじゃね?(´・ω・`)

10: 2019/08/19(月) 11:19:56.116 ID:4Qkgtom9M
>>9
どういうことなの……詳しく教えて…

12: 2019/08/19(月) 11:20:34.323 ID:4WW8E0Lr0
>>10
まず慌てないこと(´・ω・`)

7: 2019/08/19(月) 11:17:47.038 ID:hVcPuWMb0
まずお前が書いたものを貼れ

11: 2019/08/19(月) 11:20:29.367 ID:4Qkgtom9M
胸が苦しくなってきた…
再起書けたら絶対にプログラミング楽しいのにどうして俺はこんなに雑魚なの……

13: 2019/08/19(月) 11:21:00.108 ID:4WW8E0Lr0
そんで stackOverFlow って何なのか理解すること(´・ω・`)

15: 2019/08/19(月) 11:23:51.675 ID:4Qkgtom9M
スタックオーバーフローの意味は知ってるもん…
終了条件周りなんだろなってのも分かってるもん…
でも…!でも…!
全然何がどうなってるのか分かんないんだよぉ!!!!!!

16: 2019/08/19(月) 11:24:32.660 ID:4WW8E0Lr0
>>15
だから落ち着いてって言ってるの(´・ω・`)

17: 2019/08/19(月) 11:24:51.197 ID:nmp1fqNy0
スタック領域増やせば

18: 2019/08/19(月) 11:25:50.586 ID:4Qkgtom9M
>>17
絶対そういう問題じゃないでしょ…!
こんなゴミコード1億ギガバイト用意しても溢れちまうよ…!

19: 2019/08/19(月) 11:26:03.285 ID:4WW8E0Lr0
関数呼び出しの階層が深くなると こういったことが起きる古いシステムなんかもあるから

この際基本から学べ!(´・ω・`)

20: 2019/08/19(月) 11:27:12.629 ID:4Qkgtom9M
再起だけ重点的に教えてくれるとこないの…!
再起処理最強になって上級プログラマーになりたいよ…!

21: 2019/08/19(月) 11:28:27.823 ID:4WW8E0Lr0
まず>>20をちゃんとゆっくり読め!(´・ω・`)

で落ち着いてコーヒーでも飲んで今日はゆっくり安め!

でまた明日>>20を読み返せ!

22: 2019/08/19(月) 11:28:31.294 ID:AxEmpifRM
危ういだけじゃん
段階的に中間データ作って積み重ねろよ

23: 2019/08/19(月) 11:28:38.207 ID:xwtiKPRs0
普通にwhileで書けるが

・長さ2nの配列の、前半n要素を埋める
・マーカーを「n番目の埋まった要素」とする
※マーカーが指している要素を1つ後方に移動できるなら、
 ・その移動を確定させる
 ・以降の埋まった要素を全て削除し、移動した要素の直後に配置し直す
 ・マーカーを配置し直した最後の要素に再配置
・移動できないなら、マーカーが指す要素の1つ前を探し、
 ・見つかったなら※に戻る
・見つからなければ完了

33: 2019/08/19(月) 11:43:53.413 ID:xwtiKPRs0
>>23は、とりあえず前半全て埋まってる配列の要素を後ろから1つずつ動かしてくだけ

11110000
11101000←普通に最後だけ動かしてく
11100100
11100010
11100001
11011000←最後から2番目を動かした後、最後のをリセットして再スタート
   :
11000011
10111000←リセットその2
   :
00001111←リセットその4(これ以上後ろに動かせる要素がないから終了)

35: 2019/08/19(月) 11:45:15.692 ID:4Qkgtom9M
>>33
うわすごいこんな単純な仕組みでいいの…!?
むかつく…!じぶんのおつむの弱さに辟易してくるよ…!
どこでそんなロジック習ったの…!
まさかちょっと考えればわかるだろとか言うの…!?

39: 2019/08/19(月) 11:47:49.269 ID:xwtiKPRs0
>>35
手動で全て挙げろって言われたらこうやって最後の要素を変えてって操作しないか?

42: 2019/08/19(月) 11:51:29.298 ID:4Qkgtom9M
>>39
手書きで書いた図は確かにそのとおりになってたよ

no title

45: 2019/08/19(月) 11:53:00.920 ID:xwtiKPRs0
>>42
じゃあそれを実装すればよろしい

47: 2019/08/19(月) 11:53:44.894 ID:4Qkgtom9M
>>45
実装できなかったよ…
パンクしちゃった…

24: 2019/08/19(月) 11:30:33.259 ID:4WW8E0Lr0
順序回路にとって番地は大事なアドレス情報(´・ω・`)

でも人間がその数字をみてもちんぷんかんぷん

だからスタックに納めて自動的にやってもらってる

25: 2019/08/19(月) 11:31:58.254 ID:4WW8E0Lr0
ここは時間かけてもいいから理解できるまでゆっくりやり込め(´・ω・`)

26: 2019/08/19(月) 11:32:39.868 ID:QmFwzW8v0
再帰を再起って書くぐらいだから概念理解してないでしょ

27: 2019/08/19(月) 11:37:49.526 ID:xwtiKPRs0
もし再帰しようと思っても、高々2n階層くらいだな

// nコの要素のi番目以降にmコの要素がある場合の総当りリスト
function get_all(n, i, m) {
 if (n-i<m) return 結果なし
 return
   get_all(n, i+1, m-1)のそれぞれの結果にiを足したもの全て(i番目の要素を使う場合に相当)
 +get_all(n, i+1, m)のそれぞれの結果(i番目の要素を使わない場合に相当)
}

38: 2019/08/19(月) 11:47:33.734 ID:4Qkgtom9M
ちなみに>>27はどんな感じで動くの…!
多分僕が目指してたのはこっちなんだけどよくわかんないよ…!

43: 2019/08/19(月) 11:52:02.140 ID:xwtiKPRs0
>>38
1を含む結果を全て表示
 1と2を含む結果を全て表示
  1と2と3を含む結果を全て表示
   :
  1と2を含み3を含まない結果を全て表示
   :
 1を含み2を含まない結果を全て表示
  :
1を含まない結果を全て表示
 1を含まず2を含む結果を全て表示
  :
 1と2を含まない結果を全て表示
  :

こうだよ

44: 2019/08/19(月) 11:52:41.013 ID:4Qkgtom9M
>>43
わけわかんない…頭破裂しそう…

49: 2019/08/19(月) 11:54:45.101 ID:xwtiKPRs0
>>44
なんでだよ
2nコの中からnコ選ぶ場合、
『最初の要素は必ず選んだ上で残りの2n-1コの中からn-1コ選ぶ』
と『最初の要素は絶対に選ばない上で残りの2n-1コの中からnコ選ぶ』
の結果を合わせたものになるのは自明だろうが

28: 2019/08/19(月) 11:39:29.894 ID:4Qkgtom9M
ID:xwtiKPRs0
この人すごい頭良さそう…
待って…今頑張って理解するから…!

34: 2019/08/19(月) 11:44:07.109 ID:4WW8E0Lr0
>>28
if文は ()のあとに{}をつけないで直でその場合の命令をかけるけど
読みにくいから真似はしないほうがいいよ?(´・ω・`)

36: 2019/08/19(月) 11:46:36.753 ID:4Qkgtom9M
>>34
ぼくはjavaつかいだけど一行の場合は大体()省略するよ…!
条件書いてbreakとかのときって波括弧書くだけ無駄なんじゃないのって思ってます…!

41: 2019/08/19(月) 11:49:41.699 ID:4WW8E0Lr0
>>36
むだじゃないやろがぁ(´・ω・`)

オートインデントとかかけたり可読性考えたりするとそんな美学はないやろがい(´・ω・`)

29: 2019/08/19(月) 11:40:47.737 ID:4WW8E0Lr0
PICなんかのマイコンだと専用スタックがあって
pop とかPushで取り出せたりするけど
手動で取り出せたりスルけどやっぱり人間の脳だと混乱する(´・ω・`)

30: 2019/08/19(月) 11:42:13.060 ID:4Qkgtom9M
(´・ω・`)くんは言ってることがよく分かんないよ…!
stackoverflowの仕組みより今知りたいのはコードを書くロジックなんだよ…!

31: 2019/08/19(月) 11:43:09.974 ID:4ku+AeGeM
末尾再帰使えばオーバーフローしないよ

32: 2019/08/19(月) 11:43:31.810 ID:4Qkgtom9M
>>31
なにそれ…!

46: 2019/08/19(月) 11:53:08.447 ID:4ku+AeGeM
>>32
再帰でのメソッドの呼び出しがメソッドが呼ばれるたびに起きるからスタックが貯まる
だからメソッドの呼び出しを最後の最後、末尾に持ってきてスタックを貯めないのが末尾再帰

40: 2019/08/19(月) 11:48:53.082 ID:4Qkgtom9M
ねぇ再起上手くなりたい…
迷路の探索とか自分で実装できるようになりたいよ…

37: 2019/08/19(月) 11:46:46.086 ID:lLcz354nM
数学を真面目に勉強してきたならすぐ思いつくだろうな