C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part148
https://mevius.5ch.net/test/read.cgi/tech/1580471646/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1556142878/
■長いソースを貼るときはここへ。■
http://codepad.org/
https://ideone.com/
[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
探検
C++相談室 part149
レス数が950を超えています。1000を超えると書き込みができなくなります。
1デフォルトの名無しさん
2020/02/18(火) 06:19:41.54ID:xvjipUWj880デフォルトの名無しさん
2020/03/17(火) 17:18:47.62ID:1m7vQNwx >>875 gcc の ver.5 だと -Wsuggest-override って警告オプションがあるね。
これと警告をエラー扱いにする指定を組み合わせればいいのかな。
これと警告をエラー扱いにする指定を組み合わせればいいのかな。
881デフォルトの名無しさん
2020/03/20(金) 17:50:02.32ID:GuzL6Him 別に
アーキテクチャ依存の話を持ち出さずとも、
fractional(n) = n * fractional(n-1)
とゆー事実をもってただちにfractional(n)は末尾再起と言える
なぜなら
fractional(n) = n * ((n-1) * fractional(n-2))
= n * ((n-1) * ((n-2) * fractional(n-3)))
= ....
となってfractional(0)に至るまで延々展開でき、*が可換である故にこれは
fractional(n) = n * (n-1) * fractional(n-2)
= n * (n-1) * (n-2) * fractional(n-3)
= ....
となって右端を延々展開して「も」得られるからである
*の可換性への依存を良しとしない立場をとったとたん、末尾再起関数と認められるものは
f(n) = f(n-1)
とゆーnに関する恒等写像のみとなる
そう言いたいのであれば別に止めはしないがそっちの方が異端じゃないの;
つまり頭おかしい
アーキテクチャ依存の話を持ち出さずとも、
fractional(n) = n * fractional(n-1)
とゆー事実をもってただちにfractional(n)は末尾再起と言える
なぜなら
fractional(n) = n * ((n-1) * fractional(n-2))
= n * ((n-1) * ((n-2) * fractional(n-3)))
= ....
となってfractional(0)に至るまで延々展開でき、*が可換である故にこれは
fractional(n) = n * (n-1) * fractional(n-2)
= n * (n-1) * (n-2) * fractional(n-3)
= ....
となって右端を延々展開して「も」得られるからである
*の可換性への依存を良しとしない立場をとったとたん、末尾再起関数と認められるものは
f(n) = f(n-1)
とゆーnに関する恒等写像のみとなる
そう言いたいのであれば別に止めはしないがそっちの方が異端じゃないの;
つまり頭おかしい
>>881
>>881
>fractional(n) = n * fractional(n-1)
fractional(n-1) から値が帰ってきたあと、その値と n とを掛け合わせる計算は fractional(n) の関数内で実施しているでしょう?
コールした関数から戻ったときに、そのままなにもせずに得た値をリターンするのならば末尾再帰ですが、
この場合は得た値を加工してからリターンするのだから、これは末尾再帰とはいいません
> fractional(n) = n * (n-1) * fractional(n-2)
> = n * (n-1) * (n-2) * fractional(n-3)
>= ....
>となって右端を延々展開して「も」得られるからである
展開可能であることと末尾再帰であることはなんの関係もありません
>*の可換性への依存を良しとしない立場をとったとたん、末尾再起関数と認められるものは
> f(n) = f(n-1)
>とゆーnに関する恒等写像のみとなる
* の可換性はなんの関係もありません
引数を一つに限定するのならそうですが、プログラム言語は引数を二つ以上持ってもいい
普通は f() の引数を二つ以上とって、その中にアーキュムレータを置いて末尾再帰にします。
f(s, t) = f(u, v) = f(w, x) = …
むしろこっちの方が普通の末尾再帰といっていいでしょう
>>881
>fractional(n) = n * fractional(n-1)
fractional(n-1) から値が帰ってきたあと、その値と n とを掛け合わせる計算は fractional(n) の関数内で実施しているでしょう?
コールした関数から戻ったときに、そのままなにもせずに得た値をリターンするのならば末尾再帰ですが、
この場合は得た値を加工してからリターンするのだから、これは末尾再帰とはいいません
> fractional(n) = n * (n-1) * fractional(n-2)
> = n * (n-1) * (n-2) * fractional(n-3)
>= ....
>となって右端を延々展開して「も」得られるからである
展開可能であることと末尾再帰であることはなんの関係もありません
>*の可換性への依存を良しとしない立場をとったとたん、末尾再起関数と認められるものは
> f(n) = f(n-1)
>とゆーnに関する恒等写像のみとなる
* の可換性はなんの関係もありません
引数を一つに限定するのならそうですが、プログラム言語は引数を二つ以上持ってもいい
普通は f() の引数を二つ以上とって、その中にアーキュムレータを置いて末尾再帰にします。
f(s, t) = f(u, v) = f(w, x) = …
むしろこっちの方が普通の末尾再帰といっていいでしょう
883デフォルトの名無しさん
2020/03/20(金) 21:29:36.56ID:GuzL6Him >展開可能であることと末尾再帰であることはなんの関係もありません
>* の可換性はなんの関係もありません
大きく出たな…
まず右端展開の繰り返しにより表現可能でありかつ末尾再起化できない関数というものは無い
なぜなら、右端展開の繰り返しを手続き的に書けばループに他ならんぬ、、、
逆も真で、ループとして書ける関数なら右端展開の繰り返しとしても表せるんであーる
つまり、右端展開の繰り返しにより表現可能であることと、末尾再起化できる関数というものは同値
で、アキュムレータを使った複数引数の関数化というものは、関数の表現を右端展開繰り返し可能な形に直しているにすぎない
で、右端展開の繰り返しにより表現可能かどうかには演算子の結合則が関係する例は
>>881に挙げたとーり
実際、演算子の結合則が成り立たない例として、Aが行列でIが単位行列のとき
fractional3(A) = fractional3(A - I) (A - I) ・・・(1)
というブツを考えると、この関数は右端展開可能でないからもはや末尾再帰化はできない
Aが実数でIが1なら末尾再帰化できるのに…!
>* の可換性はなんの関係もありません
大きく出たな…
まず右端展開の繰り返しにより表現可能でありかつ末尾再起化できない関数というものは無い
なぜなら、右端展開の繰り返しを手続き的に書けばループに他ならんぬ、、、
逆も真で、ループとして書ける関数なら右端展開の繰り返しとしても表せるんであーる
つまり、右端展開の繰り返しにより表現可能であることと、末尾再起化できる関数というものは同値
で、アキュムレータを使った複数引数の関数化というものは、関数の表現を右端展開繰り返し可能な形に直しているにすぎない
で、右端展開の繰り返しにより表現可能かどうかには演算子の結合則が関係する例は
>>881に挙げたとーり
実際、演算子の結合則が成り立たない例として、Aが行列でIが単位行列のとき
fractional3(A) = fractional3(A - I) (A - I) ・・・(1)
というブツを考えると、この関数は右端展開可能でないからもはや末尾再帰化はできない
Aが実数でIが1なら末尾再帰化できるのに…!
884デフォルトの名無しさん
2020/03/20(金) 21:39:17.70ID:VjsvYTuj 末尾再帰であることと末尾再帰に変換できることは区別しようや
885デフォルトの名無しさん
2020/03/20(金) 21:44:34.16ID:aaY2QfPy 末尾再帰に書き換えられることなんか誰も否定してないのに一人で暴れてる
886デフォルトの名無しさん
2020/03/20(金) 21:46:22.20ID:GuzL6Him 訂正orz、
×: 結合則
○: 交換則
あとなんか式(1)は末尾再帰化可能な気がしてきたorz
×: 結合則
○: 交換則
あとなんか式(1)は末尾再帰化可能な気がしてきたorz
887デフォルトの名無しさん
2020/03/20(金) 21:52:18.14ID:aaY2QfPy そりゃ交換則なんか末尾最適化に何の関係もないからな
888デフォルトの名無しさん
2020/03/20(金) 21:58:34.74ID:VjsvYTuj >>886
CPSをググって赤面しておいで
CPSをググって赤面しておいで
>>883
>まず右端展開の繰り返しにより表現可能でありかつ末尾再起化できない関数というものは無い
>なぜなら、右端展開の繰り返しを手続き的に書けばループに他ならんぬ、、、
理解が粗いと思います
あなたのいう「右端展開」が繰り返し適応可能であればループに展開できる…@
と置いたとき、
@が事実だったとしても、それは末尾再帰となんの関係もありません
末尾再帰の最適化とは関数コール命令+関数リターン命令(call 〜 ret) をジャンプ命令に変換するという最適化でしかなく、
再帰的に記述された関数定義をループに変換する最適化の集合を「末尾再帰という」、わけではないのです
あなたは末尾再帰を広く捉えすぎです
>まず右端展開の繰り返しにより表現可能でありかつ末尾再起化できない関数というものは無い
>なぜなら、右端展開の繰り返しを手続き的に書けばループに他ならんぬ、、、
理解が粗いと思います
あなたのいう「右端展開」が繰り返し適応可能であればループに展開できる…@
と置いたとき、
@が事実だったとしても、それは末尾再帰となんの関係もありません
末尾再帰の最適化とは関数コール命令+関数リターン命令(call 〜 ret) をジャンプ命令に変換するという最適化でしかなく、
再帰的に記述された関数定義をループに変換する最適化の集合を「末尾再帰という」、わけではないのです
あなたは末尾再帰を広く捉えすぎです
890デフォルトの名無しさん
2020/03/20(金) 22:35:40.43ID:GuzL6Him >>888
ちょっCPSって継続と書いてある
右端展開の繰り返し表現可能ということと、継続で表せることは自明な勢いで同値なのでは…
つまり漏れの面の皮を通って赤面させるほどの目新しさのインパクトは無いキモス、
>>889
AとBに何の関係も無い、とは、Aの真偽とBの真偽が独立のことを言うはず…
この場合「右端展開の繰り返しで表現可能」と「ループに展開できる」ことが同値なのであるから、
何の関係も無いというのは強弁に過ぎるのでは…
>末尾再帰の最適化とは関数コール命令+関数リターン命令(call 〜 ret) をジャンプ命令に変換するという最適化でしかなく
最適化した結果のみを末尾再帰というのであれば狭く捉え過ぎwwwwww
徹頭徹尾アセンブラで議論してろよ;;
そうではなくて末尾再帰の最適化の話に限定するのであればスレを分けた方が適切なのでは…
ちょっCPSって継続と書いてある
右端展開の繰り返し表現可能ということと、継続で表せることは自明な勢いで同値なのでは…
つまり漏れの面の皮を通って赤面させるほどの目新しさのインパクトは無いキモス、
>>889
AとBに何の関係も無い、とは、Aの真偽とBの真偽が独立のことを言うはず…
この場合「右端展開の繰り返しで表現可能」と「ループに展開できる」ことが同値なのであるから、
何の関係も無いというのは強弁に過ぎるのでは…
>末尾再帰の最適化とは関数コール命令+関数リターン命令(call 〜 ret) をジャンプ命令に変換するという最適化でしかなく
最適化した結果のみを末尾再帰というのであれば狭く捉え過ぎwwwwww
徹頭徹尾アセンブラで議論してろよ;;
そうではなくて末尾再帰の最適化の話に限定するのであればスレを分けた方が適切なのでは…
891デフォルトの名無しさん
2020/03/20(金) 22:46:09.76ID:aaY2QfPy 同値じゃないよ
もっとよく考えよう
もっとよく考えよう
>>890
>この場合「右端展開の繰り返しで表現可能」と「ループに展開できる」ことが同値なのであるから、
>何の関係も無いというのは強弁に過ぎるのでは…
>>889 はそんなことを言ってはいません
>「右端展開の繰り返しで表現可能」であれば「ループに展開できる」できる…@
とおいたとき、
@と末尾再帰とが、何の関係もない、といっているのです
>最適化した結果のみを末尾再帰というのであれば狭く捉え過ぎwwwwww
>徹頭徹尾アセンブラで議論してろよ;;
最適化を実施するのに、あれこれ解析する必要がなく機械的な命令の置き換え/書き換えだけで可能である、というのが末尾再帰の肝です
まあアセンブラを理解できないようでは C/C++ の理解も薄い弱い、とは思ってはいますが
>そうではなくて末尾再帰の最適化の話に限定するのであればスレを分けた方が適切なのでは…
まず、末尾再帰とはなにか?を両者で合致するように合意をとるのが先決でしょう
>この場合「右端展開の繰り返しで表現可能」と「ループに展開できる」ことが同値なのであるから、
>何の関係も無いというのは強弁に過ぎるのでは…
>>889 はそんなことを言ってはいません
>「右端展開の繰り返しで表現可能」であれば「ループに展開できる」できる…@
とおいたとき、
@と末尾再帰とが、何の関係もない、といっているのです
>最適化した結果のみを末尾再帰というのであれば狭く捉え過ぎwwwwww
>徹頭徹尾アセンブラで議論してろよ;;
最適化を実施するのに、あれこれ解析する必要がなく機械的な命令の置き換え/書き換えだけで可能である、というのが末尾再帰の肝です
まあアセンブラを理解できないようでは C/C++ の理解も薄い弱い、とは思ってはいますが
>そうではなくて末尾再帰の最適化の話に限定するのであればスレを分けた方が適切なのでは…
まず、末尾再帰とはなにか?を両者で合致するように合意をとるのが先決でしょう
893デフォルトの名無しさん
2020/03/21(土) 01:01:36.11ID:vZ2zRqlY 厨二プログラマが食いつきやすい三大話題
・再帰
・例外処理
・
おっさんプログラマが食いつきやすい三大話題
・インデントルール
・命名規則
・
・再帰
・例外処理
・
おっさんプログラマが食いつきやすい三大話題
・インデントルール
・命名規則
・
894デフォルトの名無しさん
2020/03/21(土) 07:13:06.62ID:WKI7E4cH >893はID:vZ2zRqlYが指を咥えて見てるだけの話題
895デフォルトの名無しさん
2020/03/21(土) 07:17:58.40ID:ywBCyuHB 厨二プログラマが食いつきやすい三大話題
・再帰
・例外処理
・標準化委員会
おっさんプログラマが食いつきやすい三大話題
・インデントルール
・命名規則
・原点回帰
・再帰
・例外処理
・標準化委員会
おっさんプログラマが食いつきやすい三大話題
・インデントルール
・命名規則
・原点回帰
896デフォルトの名無しさん
2020/03/21(土) 09:05:02.13ID:uResqVEz 厨二にもおっさんにもボコボコにされるだけで歯が立たないやつ悔しそう
897デフォルトの名無しさん
2020/03/21(土) 09:51:18.47ID:SLPXMQFT malloc/freeは?
898デフォルトの名無しさん
2020/03/21(土) 10:55:38.71ID:QlEyGkfm もっと簡単に考えろ
一般に再帰は階層に復帰したときに必ず元の状態に戻さなければならない
復帰後の階層固有の計算に必要だからだ
しかし復帰後に階層固有の計算がない末尾再帰は戻す必要がない
よってループで書けるというだけの話だ
これを順序非可換の問題ととらえることはまあ理にかなっている
以下左が末尾
f(n+1)x=f(n)h(n)g(n)x≠h(n)f(n)g(n)x
f(n+1)x=h(n)f(n)g(n)x=h(n)h(n-1)f(n-1)g(n-1)g(n)x
f(n+1)x=f(n)h(n)g(n)x=f(n-1)h(n-1)g(n-1)h(n)g(n)x
h(n)h(n-1)が可能であるためにはスタックの復帰が必要よって示された
一般に再帰は階層に復帰したときに必ず元の状態に戻さなければならない
復帰後の階層固有の計算に必要だからだ
しかし復帰後に階層固有の計算がない末尾再帰は戻す必要がない
よってループで書けるというだけの話だ
これを順序非可換の問題ととらえることはまあ理にかなっている
以下左が末尾
f(n+1)x=f(n)h(n)g(n)x≠h(n)f(n)g(n)x
f(n+1)x=h(n)f(n)g(n)x=h(n)h(n-1)f(n-1)g(n-1)g(n)x
f(n+1)x=f(n)h(n)g(n)x=f(n-1)h(n-1)g(n-1)h(n)g(n)x
h(n)h(n-1)が可能であるためにはスタックの復帰が必要よって示された
899デフォルトの名無しさん
2020/03/21(土) 11:03:11.10ID:eVTFfD/2 あなた達の話は難しくてよくわかりません!
簡潔に説明すると末尾再帰ってなんなんですか?
普通の再帰と違ってスタックオーバーフローが避けられるってこと?
簡潔に説明すると末尾再帰ってなんなんですか?
普通の再帰と違ってスタックオーバーフローが避けられるってこと?
900デフォルトの名無しさん
2020/03/21(土) 11:39:49.98ID:aPGPOclr >>895
そしてテスト、保守性といったものには誰も興味を持たないのである。おしまい。
そしてテスト、保守性といったものには誰も興味を持たないのである。おしまい。
901デフォルトの名無しさん
2020/03/21(土) 12:48:43.36ID:QlEyGkfm902デフォルトの名無しさん
2020/03/21(土) 13:15:18.72ID:dTUZOuSg >>901 あんたきのうの>881だよね?
たぶん「末尾再帰」の定義が他の人(たとえば Wikipedia の「自身の再帰呼び出しが、
その計算における最後のステップになっているような再帰」)と違いそうだから、まず定義を示してもらいたい。
たぶん「末尾再帰」の定義が他の人(たとえば Wikipedia の「自身の再帰呼び出しが、
その計算における最後のステップになっているような再帰」)と違いそうだから、まず定義を示してもらいたい。
903デフォルトの名無しさん
2020/03/21(土) 13:20:58.16ID:QlEyGkfm いや違うよ
級数積が関数という認識があるかないかが彼とは違う
級数積が関数という認識があるかないかが彼とは違う
904デフォルトの名無しさん
2020/03/21(土) 15:20:30.30ID:dTUZOuSg 違うのか、悪かった。
で、あんたの「末尾再帰」の定義はどうなってんの?
で、あんたの「末尾再帰」の定義はどうなってんの?
905デフォルトの名無しさん
2020/03/21(土) 15:49:06.69ID:uResqVEz その昔、こんな再帰もやったがw
JSREE EQU *
* DO PREPARE
BSR *+2
* DO SOMETHING
RTS
JSREE EQU *
* DO PREPARE
BSR *+2
* DO SOMETHING
RTS
906デフォルトの名無しさん
2020/03/21(土) 15:52:49.00ID:QlEyGkfm907デフォルトの名無しさん
2020/03/21(土) 16:17:48.51ID:dTUZOuSg >>906
そうなると >860 の "return n * factorial(n-1) ;" における「最後のステップ」は
再帰呼び出しではなく乗算なので、その末尾再帰の定義には合致しないのでは?
そうなると >860 の "return n * factorial(n-1) ;" における「最後のステップ」は
再帰呼び出しではなく乗算なので、その末尾再帰の定義には合致しないのでは?
908デフォルトの名無しさん
2020/03/21(土) 16:25:47.20ID:QlEyGkfm909デフォルトの名無しさん
2020/03/21(土) 16:33:45.27ID:dTUZOuSg >>908 いやサッパリ。
その g やら x やらが >860 の関数とどう関係してるか、示されてないように思うし、
関係が示されたところで "return n * factorial(n-1) ;" の最終ステップが何であるかに
影響するとは思えない。
その g やら x やらが >860 の関数とどう関係してるか、示されてないように思うし、
関係が示されたところで "return n * factorial(n-1) ;" の最終ステップが何であるかに
影響するとは思えない。
910デフォルトの名無しさん
2020/03/21(土) 16:51:25.25ID:QlEyGkfm こう書いた方がよかったかな
f(n+1)x=f(n)g(n)x
f(n)g(n)=h(n)として
h(n+1)x=h(n)x
具体的には
(n+1)f(n+1)x=nf(n)x
例外は最上位の呼び出し元だけがf(n)xになっていることで、
実質h(n)=n * factorial(n-1)という関数の末尾再帰になっている
f(n+1)x=f(n)g(n)x
f(n)g(n)=h(n)として
h(n+1)x=h(n)x
具体的には
(n+1)f(n+1)x=nf(n)x
例外は最上位の呼び出し元だけがf(n)xになっていることで、
実質h(n)=n * factorial(n-1)という関数の末尾再帰になっている
911デフォルトの名無しさん
2020/03/21(土) 17:00:27.64ID:SLPXMQFT f(n)xはf(n)の結果にxを掛けるんだからf(n)が最終ステップじゃないだろ
912デフォルトの名無しさん
2020/03/21(土) 17:08:54.11ID:7OpdEFcp まずfactorialを末尾再帰に書き換えられるって話なら、そんなの当たり前だし誰も否定してない
それに加えてお前の書き換え方はおかしい
二重に話が噛み合ってなくて訳がわからない
宇宙人か?
それに加えてお前の書き換え方はおかしい
二重に話が噛み合ってなくて訳がわからない
宇宙人か?
913デフォルトの名無しさん
2020/03/21(土) 17:15:28.13ID:lGRjmGfi このスレで数学持ち出すやつは軒並みカスだな
914デフォルトの名無しさん
2020/03/21(土) 17:17:08.44ID:gYwBfwwG いい加減レス違いですよ
915デフォルトの名無しさん
2020/03/21(土) 17:27:27.62ID:QlEyGkfm おそらくわからないという人は、
末尾再帰⇔ループ
の書き換えがどうなっているのかわかっていない
末尾再帰な関数は、関数の戻り値以外のローカル変数はすべて再利用可能であるのでスタックする必要がない
そしてreturnが返しているのは戻り値である
n*はリターン値に含まれている
よってn * factorial(n-1)は一つの関数単位として扱われ得る
実際にそう扱っているかどうかは実装によるだろうが末尾再帰な関数の定義からは漏れていない
末尾再帰⇔ループ
の書き換えがどうなっているのかわかっていない
末尾再帰な関数は、関数の戻り値以外のローカル変数はすべて再利用可能であるのでスタックする必要がない
そしてreturnが返しているのは戻り値である
n*はリターン値に含まれている
よってn * factorial(n-1)は一つの関数単位として扱われ得る
実際にそう扱っているかどうかは実装によるだろうが末尾再帰な関数の定義からは漏れていない
916デフォルトの名無しさん
2020/03/21(土) 17:44:23.10ID:dTUZOuSg >>915
仮に「n * factorial(n-1)は一つの関数単位として扱われ得る」を認めたところで
最終ステップはその「関数単位」とやらであって「自身の再帰呼び出し」ではないので、
末尾再帰とは言えないよね。
・・・ >860 を末尾再帰と言えないと死ぬ病気か何かなの?
仮に「n * factorial(n-1)は一つの関数単位として扱われ得る」を認めたところで
最終ステップはその「関数単位」とやらであって「自身の再帰呼び出し」ではないので、
末尾再帰とは言えないよね。
・・・ >860 を末尾再帰と言えないと死ぬ病気か何かなの?
917デフォルトの名無しさん
2020/03/21(土) 17:51:24.98ID:QlEyGkfm918デフォルトの名無しさん
2020/03/21(土) 17:56:13.76ID:SLPXMQFT >n*はリターン値に含まれている
>よってn * factorial(n-1)は一つの関数単位として扱われ得る
リターン値に含まれていようが関数の呼び出しに含まれていなんだから「一つの関数単位」にはならんわな。
>よってn * factorial(n-1)は一つの関数単位として扱われ得る
リターン値に含まれていようが関数の呼び出しに含まれていなんだから「一つの関数単位」にはならんわな。
919デフォルトの名無しさん
2020/03/21(土) 18:04:37.39ID:lGRjmGfi そもそもこの人の数学とやらが意味不明
> (n+1)f(n+1)x=nf(n)x
乗算なのか関数の適用なのかどっちだこれ?
左辺の(n+1)はどっからでてきたんだよ
> (n+1)f(n+1)x=nf(n)x
乗算なのか関数の適用なのかどっちだこれ?
左辺の(n+1)はどっからでてきたんだよ
920デフォルトの名無しさん
2020/03/21(土) 18:17:58.54ID:dTUZOuSg921デフォルトの名無しさん
2020/03/21(土) 18:57:31.20ID:vbC+9hSb 末尾再帰とかschemeじゃないと意味無い話
末尾再帰だとループに最適化されることが言語で保証されてるって前提なのだから
そこで言う末尾再帰ではn*f(n-1)みたいなのは違う
だから変形して末尾再帰にしろって話になるのだから
末尾再帰だとループに最適化されることが言語で保証されてるって前提なのだから
そこで言う末尾再帰ではn*f(n-1)みたいなのは違う
だから変形して末尾再帰にしろって話になるのだから
922デフォルトの名無しさん
2020/03/21(土) 19:00:28.44ID:QlEyGkfm >>920
それは
return n * factorial(n-1);
と書いてはいけないと強制するということだろうか
だとしたらそれは間違っている
末尾再帰の定義を満たしているにもかかわらず認めないということはそういうことだ
それは
return n * factorial(n-1);
と書いてはいけないと強制するということだろうか
だとしたらそれは間違っている
末尾再帰の定義を満たしているにもかかわらず認めないということはそういうことだ
923デフォルトの名無しさん
2020/03/21(土) 19:03:53.90ID:vbC+9hSb 末尾再帰は関数の最後で自身を呼び出してそれをそのままreturnするものだけ
末尾再帰に変形できる関数は末尾再帰に変形できる関数であって、末尾再帰関数ではない
末尾再帰に変形できる関数は末尾再帰に変形できる関数であって、末尾再帰関数ではない
924デフォルトの名無しさん
2020/03/21(土) 19:07:05.36ID:lGRjmGfi925デフォルトの名無しさん
2020/03/21(土) 19:07:10.79ID:QlEyGkfm >>915
>n*はリターン値に含まれている
>よってn * factorial(n-1)は一つの関数単位として扱われ得る
return 式
の式に全部書いてしまえるからといっても、その式の中に存在する演算が複数あれば、それぞれの演算に順序があるわけですから
一つに扱うことはできないでしょう、この場合、リターン値を得た後で * n しているのだから、これは一つじゃなく二つ
したがって >>902 の末尾再帰の定義
>「自身の再帰呼び出しが、その計算における最後のステップになっているような再帰」
には合致せず(なぜならば、この場合の最終ステップは * n をすることだから)、>>860 で引用されたプログラムは末尾再帰ではありませんね
>n*はリターン値に含まれている
>よってn * factorial(n-1)は一つの関数単位として扱われ得る
return 式
の式に全部書いてしまえるからといっても、その式の中に存在する演算が複数あれば、それぞれの演算に順序があるわけですから
一つに扱うことはできないでしょう、この場合、リターン値を得た後で * n しているのだから、これは一つじゃなく二つ
したがって >>902 の末尾再帰の定義
>「自身の再帰呼び出しが、その計算における最後のステップになっているような再帰」
には合致せず(なぜならば、この場合の最終ステップは * n をすることだから)、>>860 で引用されたプログラムは末尾再帰ではありませんね
>>922
>それは
>return n * factorial(n-1);
>と書いてはいけないと強制するということだろうか
いいえ、単に return * factorial(n-1) と書くのならば、末尾再帰ではなくなるというだけのことです。
>末尾再帰の定義を満たしているにもかかわらず認めないということはそういうことだ
もう一度ききましょう、あなたの「末尾再帰」の定義は何ですか?
>それは
>return n * factorial(n-1);
>と書いてはいけないと強制するということだろうか
いいえ、単に return * factorial(n-1) と書くのならば、末尾再帰ではなくなるというだけのことです。
>末尾再帰の定義を満たしているにもかかわらず認めないということはそういうことだ
もう一度ききましょう、あなたの「末尾再帰」の定義は何ですか?
928デフォルトの名無しさん
2020/03/21(土) 19:12:27.37ID:QlEyGkfm929デフォルトの名無しさん
2020/03/21(土) 19:15:04.74ID:Pnykjrh9 やっぱりこいつ、末尾再帰と末尾呼び出しの区別がついていないとしか思えない
930デフォルトの名無しさん
2020/03/21(土) 19:17:28.36ID:QlEyGkfm >>929
この場合同じです
この場合同じです
931デフォルトの名無しさん
2020/03/21(土) 19:18:51.72ID:SLPXMQFT >わたしはn * factorial(n-1)は関数だと思います
これがfractional自身とは異なる以上、末尾再帰にはならんわけ。
これがfractional自身とは異なる以上、末尾再帰にはならんわけ。
932デフォルトの名無しさん
2020/03/21(土) 19:23:27.91ID:QlEyGkfm >>931
では何がわからなくてここまでの長い議論をしていたのですか?
末尾再帰が理解したいというのなら、定義そのままを暗記するだけで済んだはず
一連の私の書き込みは単に理解の方法を提示したに過ぎず、
それを否定するということは定義が理解できていたということでしょう?
では何がわからなくてここまでの長い議論をしていたのですか?
末尾再帰が理解したいというのなら、定義そのままを暗記するだけで済んだはず
一連の私の書き込みは単に理解の方法を提示したに過ぎず、
それを否定するということは定義が理解できていたということでしょう?
933デフォルトの名無しさん
2020/03/21(土) 19:23:55.22ID:bpzSUpq2 中置で書くから分かりづらくなる
ポーランドか逆ポーランドで書けば自明なのに
ポーランドか逆ポーランドで書けば自明なのに
>>928
>あなたのいう、「関数」の定義は何ですか
>わたしはn * factorial(n-1)は関数だと思います
仮に関数の定義をあきらかにしたからといっても、それは末尾再帰の定義とは関係ないでしょうね
繰り返しますが、末尾再帰の定義は >>902
>>「自身の再帰呼び出しが、その計算における最後のステップになっているような再帰」
であり、>>860 で引用されたプログラムの「自身の再帰呼び出し」すなわち「return n * factorial(n-1);」
は、計算における最後のステップになっていない(なぜならば、最後のステップはこの場合 n * であるから)ので、
>>860 で引用されたプログラムは末尾再帰ではありませんね
>あなたのいう、「関数」の定義は何ですか
>わたしはn * factorial(n-1)は関数だと思います
仮に関数の定義をあきらかにしたからといっても、それは末尾再帰の定義とは関係ないでしょうね
繰り返しますが、末尾再帰の定義は >>902
>>「自身の再帰呼び出しが、その計算における最後のステップになっているような再帰」
であり、>>860 で引用されたプログラムの「自身の再帰呼び出し」すなわち「return n * factorial(n-1);」
は、計算における最後のステップになっていない(なぜならば、最後のステップはこの場合 n * であるから)ので、
>>860 で引用されたプログラムは末尾再帰ではありませんね
935デフォルトの名無しさん
2020/03/21(土) 19:27:37.70ID:SLPXMQFT936デフォルトの名無しさん
2020/03/21(土) 19:28:51.57ID:QlEyGkfm937デフォルトの名無しさん
2020/03/21(土) 19:34:56.57ID:QlEyGkfm 逆になぜ末尾再帰にするかを考えれば、>>934の制限は強すぎる
938デフォルトの名無しさん
2020/03/21(土) 19:38:43.38ID:g81eKbe5 ID:QlEyGkfmは何でもかんでもここのみんなに教えてもらおうとせず
まず落ち着いて自分のペースでしっかり考えてみたらどうかな
みんな呆れてるよ
まず落ち着いて自分のペースでしっかり考えてみたらどうかな
みんな呆れてるよ
>>938
昔私が末尾再帰を間違えていたとき、当時からこのコテで煽り気味にやっていたにもかかわらず、最上級の親切を示して
「末尾再帰はジャンプ最適化だ!」
と教えてくださった方がおられました、当時のその方ほどの忍耐力を今回発揮できず、申し訳ございません…
昔私が末尾再帰を間違えていたとき、当時からこのコテで煽り気味にやっていたにもかかわらず、最上級の親切を示して
「末尾再帰はジャンプ最適化だ!」
と教えてくださった方がおられました、当時のその方ほどの忍耐力を今回発揮できず、申し訳ございません…
940デフォルトの名無しさん
2020/03/21(土) 19:49:38.39ID:QlEyGkfm 皆さんこそ落ち着いてください
nはスタック変数ではなく、ループのインクリメント変数なんですよ
nはスタック変数ではなく、ループのインクリメント変数なんですよ
941デフォルトの名無しさん
2020/03/21(土) 19:59:14.68ID:uResqVEz 「末尾再帰」という情報処理用語を定義しているJIS規格票もしくは
"tail recursion" という情報処理用語を定義しているISO規格票の
条項を出せるやついるの?
これだけ上から目線でマウント取っといて
あげくオレ用語だったら恥ずかしいぞ
"tail recursion" という情報処理用語を定義しているISO規格票の
条項を出せるやついるの?
これだけ上から目線でマウント取っといて
あげくオレ用語だったら恥ずかしいぞ
942デフォルトの名無しさん
2020/03/21(土) 20:03:27.21ID:bpzSUpq2 R5RSとかではなく?
943デフォルトの名無しさん
2020/03/21(土) 20:13:29.14ID:7OpdEFcp 江添が間違えたのが全部悪い
奴が間違えてなければ同じ勘違いをした気違いを呼び寄せることもなかった
奴が間違えてなければ同じ勘違いをした気違いを呼び寄せることもなかった
944デフォルトの名無しさん
2020/03/21(土) 20:38:49.06ID:g81eKbe5 江添氏は勘違いと言うより
末尾再帰というもんを単に知らなかったのではと思ってる
末尾再帰の最適化が保証されてる言語使ってる人じゃないだろうから
末尾再帰というもんを単に知らなかったのではと思ってる
末尾再帰の最適化が保証されてる言語使ってる人じゃないだろうから
945デフォルトの名無しさん
2020/03/21(土) 20:47:14.84ID:vbC+9hSb 消費税の計算を例題にあげたけど、計算方法間違ってたみたいなもの
c++的には関係ない分野の知識
c++的には関係ない分野の知識
946デフォルトの名無しさん
2020/03/21(土) 20:58:18.89ID:lGRjmGfi947デフォルトの名無しさん
2020/03/21(土) 21:07:53.04ID:XPOe/jnY 「添字を持つ添字」みたいなもんを上手に管理する方法ってある?
例えば、
0 <= i < n である全ての i について a[i] を 0 から m の範囲で動かす
みたいなループの構造を想定してる。
当然大きな多重ループになるから小さい n と m についてしか使えないと思うけど、デバッグなどのときにこういうのを簡潔にミスらず書けたらと思っての質問です
例えば、
0 <= i < n である全ての i について a[i] を 0 から m の範囲で動かす
みたいなループの構造を想定してる。
当然大きな多重ループになるから小さい n と m についてしか使えないと思うけど、デバッグなどのときにこういうのを簡潔にミスらず書けたらと思っての質問です
948デフォルトの名無しさん
2020/03/21(土) 21:15:03.39ID:lGRjmGfi949デフォルトの名無しさん
2020/03/21(土) 21:44:53.81ID:XPOe/jnY >>948
for(a=0; a<m; a++)
for(b=0; b<m; b++)
for(c=0; c<m; c++)
...
という形の多重ループのループ変数 a, b, c,... を a[0], a[1], a[2],... にしたいという意味です。
TeX の文法で数式を書けば
\prod_{i=0}^{n} \sum_{a[i]=0}^{m}
という意味です。
・数式との対応が分かりやすい形で書きたい
・簡潔でミスしにくい形で書きたい
といった理由で質問させていただいてます。
for(a=0; a<m; a++)
for(b=0; b<m; b++)
for(c=0; c<m; c++)
...
という形の多重ループのループ変数 a, b, c,... を a[0], a[1], a[2],... にしたいという意味です。
TeX の文法で数式を書けば
\prod_{i=0}^{n} \sum_{a[i]=0}^{m}
という意味です。
・数式との対応が分かりやすい形で書きたい
・簡潔でミスしにくい形で書きたい
といった理由で質問させていただいてます。
950デフォルトの名無しさん
2020/03/21(土) 21:46:40.54ID:XPOe/jnY951デフォルトの名無しさん
2020/03/21(土) 22:26:18.85ID:SLPXMQFT >という形の多重ループのループ変数 a, b, c,... を a[0], a[1], a[2],... にしたいという意味です。
やればいいだけの話じゃなくて?質問は何だろう。
やればいいだけの話じゃなくて?質問は何だろう。
952デフォルトの名無しさん
2020/03/21(土) 22:38:22.14ID:XPOe/jnY >>951
n が実行時に決まるような場合どうしたら良いかという意味です
n が実行時に決まるような場合どうしたら良いかという意味です
953デフォルトの名無しさん
2020/03/21(土) 22:39:31.10ID:lGRjmGfi954デフォルトの名無しさん
2020/03/21(土) 22:40:14.16ID:vbC+9hSb 本当に実行時なら再帰で書くしか無いんじゃね
955デフォルトの名無しさん
2020/03/21(土) 22:49:54.75ID:XPOe/jnY >>953-954
ありがとうございます。
再帰templateで調べてみます。
あと書いてて気付いたのですが、n桁のm進数にループ変数 a[0], a[1],... をエンコードするっていうのも一つの方法かなと思いました。
ありがとうございます。
再帰templateで調べてみます。
あと書いてて気付いたのですが、n桁のm進数にループ変数 a[0], a[1],... をエンコードするっていうのも一つの方法かなと思いました。
956デフォルトの名無しさん
2020/03/21(土) 22:50:20.71ID:lGRjmGfi 確かにtemplateでなくても再帰で可能か
ただlambdaで渡せないからstd::functionで包む必要あるね
ただlambdaで渡せないからstd::functionで包む必要あるね
957デフォルトの名無しさん
2020/03/21(土) 22:57:37.57ID:80zI/5JK >>949
やりたいことは、係数をm^2の2次元配列xとm^3の3次元配列yに入れておいて、2番目のループではx[a][b], 3番目のループではy[a][b][c]を使用するということか?
サイズ可変でも動的に確保すればいいだけ。
やりたいことは、係数をm^2の2次元配列xとm^3の3次元配列yに入れておいて、2番目のループではx[a][b], 3番目のループではy[a][b][c]を使用するということか?
サイズ可変でも動的に確保すればいいだけ。
958デフォルトの名無しさん
2020/03/21(土) 22:58:48.87ID:80zI/5JK すまん、全くの検討違いだったようだ
959デフォルトの名無しさん
2020/03/21(土) 23:07:32.20ID:XPOe/jnY960デフォルトの名無しさん
2020/03/22(日) 00:59:09.60ID:7dJergc9 全てのa[i]が始点0,終点mならa[i]でなくてもjとかでよくね?
961デフォルトの名無しさん
2020/03/22(日) 01:21:14.83ID:GKarRavC std::sortに並列化+ベクトル化指定つけて実行したら、コア数以上に高速化したんだけど、なんで?
962デフォルトの名無しさん
2020/03/22(日) 01:31:16.84ID:ESnYypih キャッシュに全部載るようになったとか
963デフォルトの名無しさん
2020/03/22(日) 01:36:53.01ID:7dJergc9964デフォルトの名無しさん
2020/03/22(日) 02:31:12.30ID:7dJergc9 >>955
こういう解釈でいいのかな
ループがふたつになるかな
a=new int[n];
for(i=0;i<m^n;i++){
for(j=0;j<n;j++){
a[j]=i%m;
i/=m;
}
function(a,n);
}
delete[] a;
こういう解釈でいいのかな
ループがふたつになるかな
a=new int[n];
for(i=0;i<m^n;i++){
for(j=0;j<n;j++){
a[j]=i%m;
i/=m;
}
function(a,n);
}
delete[] a;
965デフォルトの名無しさん
2020/03/22(日) 02:42:13.57ID:5XORMJuJ966はちみつ餃子 ◆8X2XSCHEME
2020/03/22(日) 11:52:38.51ID:I961moxw967デフォルトの名無しさん
2020/03/22(日) 11:56:28.35ID:GKarRavC 多重継承のときのCRTPについて説明してるサイトないですか
968デフォルトの名無しさん
2020/03/22(日) 14:40:43.43ID:VphPQW8g そんなモンがあるなんて初めて知った
やはりC++は奥が深いな
やはりC++は奥が深いな
969デフォルトの名無しさん
2020/03/22(日) 19:39:49.88ID:HvrypJyW >>949
>TeX の文法で数式を書けば
>\prod_{i=0}^{n} \sum_{a[i]=0}^{m}
>という意味です。
絶対ではないが、標準的な数学の記法だと、その意味では、
\sum_{a[0]=0}^{m}・・・\sum_{a[n]=0}^{m}
と書くのがが普通だと思う。
ところでそれは量子力学の経路積分か何かですか?
経路積分の場合は、本によって上記の部分に割と独特の変な記号を使う場合があって、
あなたの書いたように書いてある本もあるかもしれません。
ただ、普通の数学記法だと余り使いませんよね、その書き方は。
>TeX の文法で数式を書けば
>\prod_{i=0}^{n} \sum_{a[i]=0}^{m}
>という意味です。
絶対ではないが、標準的な数学の記法だと、その意味では、
\sum_{a[0]=0}^{m}・・・\sum_{a[n]=0}^{m}
と書くのがが普通だと思う。
ところでそれは量子力学の経路積分か何かですか?
経路積分の場合は、本によって上記の部分に割と独特の変な記号を使う場合があって、
あなたの書いたように書いてある本もあるかもしれません。
ただ、普通の数学記法だと余り使いませんよね、その書き方は。
970デフォルトの名無しさん
2020/03/22(日) 19:46:47.90ID:HvrypJyW >>969
補足すれば、普通の数学記法だと
\sum_{a[0]=0}^{m}・・・\sum_{a[n]=0}^{m} f(a[0],・・・,a[n]) //(1)
ですね。
\prod_{i=0}^{n} \sum_{a[i]=0}^{m} //(2)
の記号の場合は、
X= \prod_{i=0}^{n} \sum_{a[i]=0}^{m} g_i(a[i]) //(3)
の場合は、
b[i] = \sum_{a[i]=0}^{m} g_i(a[i]) //(4)
(i=0, ・・・, n)
を先に計算しておいて、
X = \prod_{i=0}^{n} b[i] //(5)
= b[0]・・・b[i] //(6)
の意味に解釈するのが標準的な数学の記号の使い方だと個人的には思います。
(1)と(3)ではかなり意味が違いますが、(2)の記号を、(1)の先頭に使えるかと言えば、
絶対使えないわけでは有りませんが、使う前に何らかの補足説明が必要になりそうです。
補足すれば、普通の数学記法だと
\sum_{a[0]=0}^{m}・・・\sum_{a[n]=0}^{m} f(a[0],・・・,a[n]) //(1)
ですね。
\prod_{i=0}^{n} \sum_{a[i]=0}^{m} //(2)
の記号の場合は、
X= \prod_{i=0}^{n} \sum_{a[i]=0}^{m} g_i(a[i]) //(3)
の場合は、
b[i] = \sum_{a[i]=0}^{m} g_i(a[i]) //(4)
(i=0, ・・・, n)
を先に計算しておいて、
X = \prod_{i=0}^{n} b[i] //(5)
= b[0]・・・b[i] //(6)
の意味に解釈するのが標準的な数学の記号の使い方だと個人的には思います。
(1)と(3)ではかなり意味が違いますが、(2)の記号を、(1)の先頭に使えるかと言えば、
絶対使えないわけでは有りませんが、使う前に何らかの補足説明が必要になりそうです。
971デフォルトの名無しさん
2020/03/22(日) 19:47:50.29ID:HvrypJyW >>970
誤: = b[0]・・・b[i] //(6)
正: = b[0]・・・b[n] //(6)
誤: = b[0]・・・b[i] //(6)
正: = b[0]・・・b[n] //(6)
972デフォルトの名無しさん
2020/03/22(日) 21:29:26.79ID:LOA9pF7P >>967
派生が継承してる複数の基底を受け取りたいとか?
派生が継承してる複数の基底を受け取りたいとか?
973デフォルトの名無しさん
2020/03/23(月) 12:49:54.29ID:bf1cRh+B int *pInts = new int[10]();
とした場合の最後の()の意味は何でしょうか?
付けない場合との差を教えてください。
とした場合の最後の()の意味は何でしょうか?
付けない場合との差を教えてください。
974はちみつ餃子 ◆8X2XSCHEME
2020/03/23(月) 13:29:11.05ID:FLdc410A >>973
イニシャライザ。
普通のクラスではそれがないときはデフォルトコンストラクタで初期化される (空の括弧があっても無くても同じ挙動) けど、
int 等では初期化を明示しない限り初期化されない。
逆に言えばこの場合は初期化を明示しているので初期化される。 (0 が入る)
イニシャライザ。
普通のクラスではそれがないときはデフォルトコンストラクタで初期化される (空の括弧があっても無くても同じ挙動) けど、
int 等では初期化を明示しない限り初期化されない。
逆に言えばこの場合は初期化を明示しているので初期化される。 (0 が入る)
975デフォルトの名無しさん
2020/03/23(月) 13:37:39.77ID:bf1cRh+B >>974
有難うございます。では、
int *pInts = new int[3](1,2,3); //(1)
int *pInts = new int[3]{1,2,3}; //(2)
の違いは何でしょうか?
有難うございます。では、
int *pInts = new int[3](1,2,3); //(1)
int *pInts = new int[3]{1,2,3}; //(2)
の違いは何でしょうか?
976はちみつ餃子 ◆8X2XSCHEME
2020/03/23(月) 14:11:51.67ID:FLdc410A >>975
(2) の場合には集成体初期化になる。
https://ja.cppreference.com/w/cpp/language/new#.E6.A7.8B.E7.AF.89
(1) も C++20 からは集成体初期化になる。
だけど gcc と clang の最新版で試しても出来ないっぽいし、
あえて丸括弧で書きたい理由はないなぁ。
(2) の場合には集成体初期化になる。
https://ja.cppreference.com/w/cpp/language/new#.E6.A7.8B.E7.AF.89
(1) も C++20 からは集成体初期化になる。
だけど gcc と clang の最新版で試しても出来ないっぽいし、
あえて丸括弧で書きたい理由はないなぁ。
977デフォルトの名無しさん
2020/03/23(月) 14:16:57.36ID:bf1cRh+B978デフォルトの名無しさん
2020/03/23(月) 14:16:57.82ID:bf1cRh+B979デフォルトの名無しさん
2020/03/23(月) 14:18:32.74ID:bf1cRh+B980はちみつ餃子 ◆8X2XSCHEME
2020/03/23(月) 14:39:25.62ID:FLdc410Aレス数が950を超えています。1000を超えると書き込みができなくなります。
ニュース
- 中国側が首相答弁の撤回要求、日本側拒否 [夜のけいちゃん★]
- 中国の局長は「両手をポケット」で対峙 宣伝戦で国民に示す ★3 [蚤の市★]
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★4 [ぐれ★]
- 映画「鬼滅の刃」の興行収入急減、日本行き航空券大量キャンセル…中国メディア報道 [蚤の市★]
- 【音楽】Perfume・あ~ちゃんの結婚相手「一般男性」は吉田カバンの社長・吉田幸裕氏(41) 高身長で山本耕史似 [Ailuropoda melanoleuca★]
- 「タワマン天国」に飛びつく若者…SNSに転がる「成功体験」に続けるのか 湾岸エリアの業者が語った現実 [蚤の市★]
- 【悲報】日本人錯乱「集団的自衛権行使に賛成。けど自衛隊を戦わせるのは反対」 [237216734]
- 【悲報】高市効果で「1ドル=160円」が相場へwwwwwwwwwwwwwwwwwwwwwwwwwwwww 止まらぬ高市円安💥💥 [871926377]
- 小川彩佳アナ「高市総理はここまで影響が出ることを想像して発言したんでしょうか」高市ソルジャー「!!!!(シュババババ)」 [931948549]
- 今来た遊戯王やってる奴スレ
- FGOで好きなサーヴァントがアビゲイル、北斎、楊貴妃なんだが
- 自閉症が「んなっしょい」と連呼するお🏡
