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
レス数が900を超えています。1000を超えると表示できなくなるよ。
1デフォルトの名無しさん
2020/02/18(火) 06:19:41.54ID:xvjipUWj818デフォルトの名無しさん
2020/03/12(木) 17:45:34.82ID:5A3Kadll 遅いと思うとかじゃなくて実際にやった結果
listは激遅
dequeが1番良い
追加削除してもな
listは激遅
dequeが1番良い
追加削除してもな
819デフォルトの名無しさん
2020/03/12(木) 18:50:46.21ID:xw4q52xX >>812
C++関係ないからWin32APIスレとかで聞けばいいんでないの?
C++関係ないからWin32APIスレとかで聞けばいいんでないの?
820デフォルトの名無しさん
2020/03/12(木) 18:52:40.90ID:xw4q52xX >>813
リンクリストがオールマイティというのは、お前がリンクリスト使う処理しか書かないからというだけじゃね?
リンクリストがオールマイティというのは、お前がリンクリスト使う処理しか書かないからというだけじゃね?
821デフォルトの名無しさん
2020/03/12(木) 20:25:21.28ID:YvE3jgHm 天才の人でしょ
ほっとこ
ほっとこ
822デフォルトの名無しさん
2020/03/12(木) 20:30:58.97ID:9KLbHvc8 必死こいてリンクリスト宣伝して何になるんだろう
823デフォルトの名無しさん
2020/03/12(木) 20:40:10.69ID:yVQIWR3t824デフォルトの名無しさん
2020/03/12(木) 21:40:44.59ID:4MxR0DBA >>782
丁寧に説明していただいてありがとうございます!
丁寧に説明していただいてありがとうございます!
825デフォルトの名無しさん
2020/03/13(金) 03:26:23.39ID:BoiDYB4T ウヘン参照はどんなときに役立つんだ?
即値が代入出来るようになっただけか?
即値が代入出来るようになっただけか?
826デフォルトの名無しさん
2020/03/13(金) 07:01:46.94ID:8hjAly81 >>825
右辺値参照は右辺値(何もしないとその場で消えてなくなってしまうもの)をコピーを発生させずに捕まえておくことができる。
例:
>>782の
auto && __range = vec;
(正確にはauto&&はvecが左辺値の場合は通常の参照に、vecが右辺値の場合は右辺値参照になる)
他には関数のオーバーロードと組み合わせて引数が左辺値なのか右辺値なのかを区別して処理を振り分けることができる。
例:
void func(std::vector<int>& vec){ std::cout << "左辺値専用の処理" << std::endl; }
void func(std::vector<int>&& vec){ std::cout << "右辺値専用の処理" << std::endl; }
int main(){
std::vector<int> vec;
func(vec); // -> 左辺値専用の処理
func(std::vector<int>{1,2,3}); // -> 右辺値専用の処理
return 0;
}
右辺値参照は右辺値(何もしないとその場で消えてなくなってしまうもの)をコピーを発生させずに捕まえておくことができる。
例:
>>782の
auto && __range = vec;
(正確にはauto&&はvecが左辺値の場合は通常の参照に、vecが右辺値の場合は右辺値参照になる)
他には関数のオーバーロードと組み合わせて引数が左辺値なのか右辺値なのかを区別して処理を振り分けることができる。
例:
void func(std::vector<int>& vec){ std::cout << "左辺値専用の処理" << std::endl; }
void func(std::vector<int>&& vec){ std::cout << "右辺値専用の処理" << std::endl; }
int main(){
std::vector<int> vec;
func(vec); // -> 左辺値専用の処理
func(std::vector<int>{1,2,3}); // -> 右辺値専用の処理
return 0;
}
827はちみつ餃子 ◆8X2XSCHEME
2020/03/13(金) 09:59:34.43ID:o4vL6hq2 右辺値参照はほとんどムーブのための機能と言ってもいいかな。
左辺値か右辺値かを「区別」できることが重要であって、
参照の機能として特別なものがあるわけではない。
この区別が必要になったのはコピーの文脈かムーブの文脈かを知るため。
std::move が右辺値にキャストするだけということからも右辺値とムーブの関連性の強さが感じられる。
その上で右辺値参照と左辺値参照を自動で振り分ける参照 (ユニバーサル参照) を使えば
定義はひとつしか書いていないのに左辺値と右辺値の両方に対応できているなんてことも出来る。
ただし、右辺値参照は左辺値だということを忘れないように。
参照が左辺値参照か右辺値参照であるかを区別して再度振り分けなおすために std::forward がある。
左辺値か右辺値かを「区別」できることが重要であって、
参照の機能として特別なものがあるわけではない。
この区別が必要になったのはコピーの文脈かムーブの文脈かを知るため。
std::move が右辺値にキャストするだけということからも右辺値とムーブの関連性の強さが感じられる。
その上で右辺値参照と左辺値参照を自動で振り分ける参照 (ユニバーサル参照) を使えば
定義はひとつしか書いていないのに左辺値と右辺値の両方に対応できているなんてことも出来る。
ただし、右辺値参照は左辺値だということを忘れないように。
参照が左辺値参照か右辺値参照であるかを区別して再度振り分けなおすために std::forward がある。
828デフォルトの名無しさん
2020/03/13(金) 11:05:37.71ID:PLNbAfh2 auto&&は右辺値参照のくせに左辺値を束縛できるぞ
829デフォルトの名無しさん
2020/03/13(金) 12:25:06.20ID:0DRjOF6k ユニバーサルはテンプレートの文脈(なおかつTがテンプレート仮引数そのもの)
でなければ使えない
便利さばっか強調してると誤解招くぞ
でなければ使えない
便利さばっか強調してると誤解招くぞ
831デフォルトの名無しさん
2020/03/14(土) 06:54:36.59ID:rF6MWNax arithmeticとかpromotedってなんぞ
c++11以降のpow(int, int)の返り値はintなのですか?
c++11以降のpow(int, int)の返り値はintなのですか?
832デフォルトの名無しさん
2020/03/14(土) 09:56:19.78ID:LPZ7/QQq833はちみつ餃子 ◆8X2XSCHEME
2020/03/14(土) 15:29:27.33ID:7CRfyKLY >>831
候補として書いてある通りの型しかないよ。
https://ja.cppreference.com/w/cpp/numeric/math/pow
だけど、普通にオーバーロードしたら曖昧な状況が出来る場合があるだろ。
float foo(float x) { return x; }
double foo(double x) { return x; }
int main(void) {
foo(1); // どちらを呼び出せばいいのかわかんのでエラー。
return 0;
}
かといって int 版を追加、 long int 版、 long long int 版を追加……とかしていくのは面倒だなぁってことになるわけ。
それも二引数だったら全部の組み合わせが必要になってくる。
で、関数テンプレートで算術型ならなんでも受け取れるようにしておいて候補のどれかに振り分けるようにしようみたいな。
そういう感じ。
うまいこと振り分けなおす関数テンプレートがあるってだけ。
候補として書いてある通りの型しかないよ。
https://ja.cppreference.com/w/cpp/numeric/math/pow
だけど、普通にオーバーロードしたら曖昧な状況が出来る場合があるだろ。
float foo(float x) { return x; }
double foo(double x) { return x; }
int main(void) {
foo(1); // どちらを呼び出せばいいのかわかんのでエラー。
return 0;
}
かといって int 版を追加、 long int 版、 long long int 版を追加……とかしていくのは面倒だなぁってことになるわけ。
それも二引数だったら全部の組み合わせが必要になってくる。
で、関数テンプレートで算術型ならなんでも受け取れるようにしておいて候補のどれかに振り分けるようにしようみたいな。
そういう感じ。
うまいこと振り分けなおす関数テンプレートがあるってだけ。
834デフォルトの名無しさん
2020/03/14(土) 21:46:19.71ID:47FyzBVp c++のお勧め本教えて
初心者ではないけど、ここの話に付いていけるようにちゃんと学習したく。
初心者ではないけど、ここの話に付いていけるようにちゃんと学習したく。
835デフォルトの名無しさん
2020/03/14(土) 21:48:34.12ID:pvdkYWPZ とりあえずeffectve modern c++読んで
次は「ISO/IEC 14882:2017 Programming Languages -- C++」とかいう本を読むといいよ
次は「ISO/IEC 14882:2017 Programming Languages -- C++」とかいう本を読むといいよ
836デフォルトの名無しさん
2020/03/14(土) 23:28:51.97ID:mG8QFb0E 江添亮でいいのでは
837デフォルトの名無しさん
2020/03/15(日) 00:20:59.48ID:CAhbnrV8838デフォルトの名無しさん
2020/03/15(日) 01:01:17.34ID:r+ZbHRhu >>836
本の名前は?
本の名前は?
839デフォルトの名無しさん
2020/03/15(日) 07:49:43.36ID:4h5eTXB1840デフォルトの名無しさん
2020/03/15(日) 09:41:19.99ID:d31MAJ7H 捨て魔乙
841デフォルトの名無しさん
2020/03/15(日) 10:23:33.77ID:b9Qsc7j/ ステマというか、C++ の開発者で、
標準化委員会の江添亮、επιστημη(エピステーメー)、高橋 晶などを、
知らない香具師は、いないだろ
標準化委員会の江添亮、επιστημη(エピステーメー)、高橋 晶などを、
知らない香具師は、いないだろ
842デフォルトの名無しさん
2020/03/15(日) 10:26:55.73ID:xxuRolQk そりゃ有名だが悪い意味すぎるだろ。
843841
2020/03/15(日) 11:28:19.19ID:b9Qsc7j/ C++11/14 コア言語、江添 亮、2015
でも、この本は、プロにとっては、神の書!
規格書の意味を、簡潔なソースコードで例示したのだから
でも、C++の恐ろしいのは、これでもすべてじゃない!
あまりにもルールが多すぎるから、省略ばっかりw
でも、この本は、プロにとっては、神の書!
規格書の意味を、簡潔なソースコードで例示したのだから
でも、C++の恐ろしいのは、これでもすべてじゃない!
あまりにもルールが多すぎるから、省略ばっかりw
844841
2020/03/15(日) 11:34:21.68ID:b9Qsc7j/ 組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド、MISRA‐C研究会、2006
この研究会は、トヨタなど大企業から、数十人のベテが集まって、
簡潔なソースコードで例示したけど、
江添の「C++11/14 コア言語」は、一人で書いたのが恐ろしい。
エベレスト単独登頂ぐらいの記録w
あまりにも、crazy
この研究会は、トヨタなど大企業から、数十人のベテが集まって、
簡潔なソースコードで例示したけど、
江添の「C++11/14 コア言語」は、一人で書いたのが恐ろしい。
エベレスト単独登頂ぐらいの記録w
あまりにも、crazy
845デフォルトの名無しさん
2020/03/15(日) 11:36:58.87ID:uLtpsypH いまどき香具氏て…
846デフォルトの名無しさん
2020/03/15(日) 12:01:05.67ID:MhnteVR9 >>844
内容に間違いないことどうやって担保してんの?
内容に間違いないことどうやって担保してんの?
847デフォルトの名無しさん
2020/03/15(日) 12:06:13.12ID:4h5eTXB1 その本に限ったことではなく
聞いた話は他のソースで裏を取るのが
騙されたくない人のすることだ
お昼のワイドショーに洗脳されるBBAがこの逆をいく例
聞いた話は他のソースで裏を取るのが
騙されたくない人のすることだ
お昼のワイドショーに洗脳されるBBAがこの逆をいく例
849デフォルトの名無しさん
2020/03/15(日) 12:19:04.85ID:g709JiKq 原稿のコードを自動でチェックするシステムくらいは作れるだろ
他の間違いはしらない
他の間違いはしらない
850デフォルトの名無しさん
2020/03/15(日) 12:54:08.39ID:+dNV/3ST とりあえず明らかな間違いはあるな。
http://ezoeryou.github.io/cpp-book/C++11-Syntax-and-Feature.xhtml#expr.pseudo
> 疑似デストラクター呼び出しとは、デストラクターを明示的に呼び出すことができる一連の式である。
http://ezoeryou.github.io/cpp-book/C++11-Syntax-and-Feature.xhtml#expr.pseudo
> 疑似デストラクター呼び出しとは、デストラクターを明示的に呼び出すことができる一連の式である。
851デフォルトの名無しさん
2020/03/15(日) 13:31:42.55ID:kwDmCDNs ほんとだセミコロン忘れてる
852デフォルトの名無しさん
2020/03/15(日) 20:45:50.04ID:jQKVyB4O >>842
わろた
わろた
853デフォルトの名無しさん
2020/03/15(日) 21:05:04.93ID:mDv1gcW7 >>849
自動チェックに使うコンパイラは?
自動チェックに使うコンパイラは?
854デフォルトの名無しさん
2020/03/15(日) 21:16:57.24ID:+dNV/3ST855デフォルトの名無しさん
2020/03/15(日) 21:23:17.68ID:xxuRolQk そういうテストの発想が江添には根本的に欠けてる。
856デフォルトの名無しさん
2020/03/15(日) 21:31:41.42ID:kwDmCDNs あの人ソフトウェアエンジニアじゃないからな
857デフォルトの名無しさん
2020/03/15(日) 22:05:46.40ID:xxuRolQk 言語についてあれこれ言うなら今時は必要な視点だろ。
20年前で時間が止まってんのかね。
20年前で時間が止まってんのかね。
858デフォルトの名無しさん
2020/03/15(日) 22:40:56.98ID:+dNV/3ST コードのチェックについてはその後反省して改善したらしいよ。
https://cpplover.blogspot.com/2016/09/c17.html
> 参考書のソースコードからサンプルコードを抽出してコンパイルするテストは、適当なツールがなかったので適当に実装した。C++で書いて200行ぐらいだった。
https://cpplover.blogspot.com/2016/09/c17.html
> 参考書のソースコードからサンプルコードを抽出してコンパイルするテストは、適当なツールがなかったので適当に実装した。C++で書いて200行ぐらいだった。
859デフォルトの名無しさん
2020/03/15(日) 22:51:25.52ID:rc8Rza68 ストラウストラップの本こき下ろしてたクセにテメェもろくな本書けないっていう
ストラウストラップの本拾い読みする方が何万倍ありがたいわな
ストラウストラップの本拾い読みする方が何万倍ありがたいわな
江添さんのC++入門本を読んでいますが、「末尾再帰」を完全に間違えていますね…
私と同じ間違え方でしたが、私以外にも間違える人がまだ居るようですね
view-source:https://ezoeryou.github.io/cpp-intro/#再帰関数
>int factorial( int n )
>{
> if ( n < 1 )
> return 0 ;
> else if ( n == 1 )
> return 1 ;
> else
> return n * factorial(n-1) ;
>}
>この関数は、引数nが1未満であれば引数が間違っているので0を返す。そうでない場合でnが1であれば1を返す。それ以外の場合、n * factorial(n-1)を返す。
>このコードは末尾再帰になっている。
私と同じ間違え方でしたが、私以外にも間違える人がまだ居るようですね
view-source:https://ezoeryou.github.io/cpp-intro/#再帰関数
>int factorial( int n )
>{
> if ( n < 1 )
> return 0 ;
> else if ( n == 1 )
> return 1 ;
> else
> return n * factorial(n-1) ;
>}
>この関数は、引数nが1未満であれば引数が間違っているので0を返す。そうでない場合でnが1であれば1を返す。それ以外の場合、n * factorial(n-1)を返す。
>このコードは末尾再帰になっている。
861デフォルトの名無しさん
2020/03/16(月) 00:22:37.82ID:G3zRW41Y ええ・・・本にする前に誰も気付かんかったんか・・・
862デフォルトの名無しさん
2020/03/16(月) 00:45:44.02ID:0NEQgDaD863はちみつ餃子 ◆8X2XSCHEME
2020/03/16(月) 01:14:59.26ID:5L/YS0FP864デフォルトの名無しさん
2020/03/16(月) 03:21:15.54ID:gTHYoNh+ 大抵一番目の引数はレジスタで代用したりする最適化するよね
865デフォルトの名無しさん
2020/03/16(月) 05:32:55.58ID:3/OYci0N 0の階乗は1だよ普通は
866デフォルトの名無しさん
2020/03/16(月) 06:24:40.20ID:ZXIIT5PQ >>864
それは最適化ではなくABIで決まっていることでは
それは最適化ではなくABIで決まっていることでは
867デフォルトの名無しさん
2020/03/16(月) 09:19:27.29ID:BYpTFeXn >>860
>return n * factorial(n-1) ;
n を掛けたら、ダメなのか。
return factorial(引数)としないといけないのか
関数の引数に、蓄積器を持つように、変形しないといけないのか
>return n * factorial(n-1) ;
n を掛けたら、ダメなのか。
return factorial(引数)としないといけないのか
関数の引数に、蓄積器を持つように、変形しないといけないのか
868デフォルトの名無しさん
2020/03/16(月) 09:39:27.07ID:W7KsQnwt スタックが何を保持しとかないといけないか考えたらわかることだけどね。
869はちみつ餃子 ◆8X2XSCHEME
2020/03/16(月) 11:27:12.93ID:5L/YS0FP >>867
末尾で呼び出した関数の返却値を「何も加工せずに」そのまま返却値にするような場合は、
素朴なスタックを使う ABI だと積んだのを直後に降ろす操作になるだけなんだ。
だから相殺してスタック操作を消せる。 call と ret からスタック操作を消すとジャンプになるという理屈。
Wikipedia の説明とかを見てもわかりにくいんだけど、スタックの動きで考えるとわかりやすいと私は思う。
末尾で呼び出した関数の返却値を「何も加工せずに」そのまま返却値にするような場合は、
素朴なスタックを使う ABI だと積んだのを直後に降ろす操作になるだけなんだ。
だから相殺してスタック操作を消せる。 call と ret からスタック操作を消すとジャンプになるという理屈。
Wikipedia の説明とかを見てもわかりにくいんだけど、スタックの動きで考えるとわかりやすいと私は思う。
870デフォルトの名無しさん
2020/03/16(月) 17:12:50.16ID:cfMsQza/ >>869
32BIT の x86のアセンブラで書けば、
push dword ptr a2
push dword ptr a1
call func_addr
add esp,8
ret
となっているのを
mov eax,a1
mov [ebp+xxx1],eax // xxx1は仮引数1のスタック上の相対位置
mov eax,a2
mov [ebp+xxx2],eax // xxx2は仮引数2のスタック上の相対位置
jmp func_addr
などとすると。再帰を行わなくても
return retcode; 文は、
mov eax,retcode
add esp,8
ret
とコンパイルされるから、結局等価になる。
32BIT の x86のアセンブラで書けば、
push dword ptr a2
push dword ptr a1
call func_addr
add esp,8
ret
となっているのを
mov eax,a1
mov [ebp+xxx1],eax // xxx1は仮引数1のスタック上の相対位置
mov eax,a2
mov [ebp+xxx2],eax // xxx2は仮引数2のスタック上の相対位置
jmp func_addr
などとすると。再帰を行わなくても
return retcode; 文は、
mov eax,retcode
add esp,8
ret
とコンパイルされるから、結局等価になる。
871デフォルトの名無しさん
2020/03/17(火) 06:17:25.18ID:1m7vQNwx コンパイラに「inline指定された部分がインライン化できなかったら警告」
みたいなオプションがあるけど、それと同様に、
プログラマが末尾再帰のつもりで書いた関数(ソースに明示する)が
実際には末尾再帰じゃない場合に指摘してくれるような機能はないじゃろか。
最適化機構の中でチェックできてるはずだし、学習の役立ちそうな気がする。
末尾再帰に慣れた人には不要な補助輪だろうけど。
みたいなオプションがあるけど、それと同様に、
プログラマが末尾再帰のつもりで書いた関数(ソースに明示する)が
実際には末尾再帰じゃない場合に指摘してくれるような機能はないじゃろか。
最適化機構の中でチェックできてるはずだし、学習の役立ちそうな気がする。
末尾再帰に慣れた人には不要な補助輪だろうけど。
872デフォルトの名無しさん
2020/03/17(火) 07:39:32.88ID:xTOfsl1/ 二本のスタックを使って木をコピーする方法を思いついてしまったかもしれない。
873デフォルトの名無しさん
2020/03/17(火) 09:20:37.53ID:wg7JTafn 心底どうでもいい機能を無駄に入れようとするな
そんなことするくらいなら自力で再帰でない書き方する方がまともな対応
スタック消費を気にするなら再帰で書こうとすること自体が間違ってる
そんなことするくらいなら自力で再帰でない書き方する方がまともな対応
スタック消費を気にするなら再帰で書こうとすること自体が間違ってる
874デフォルトの名無しさん
2020/03/17(火) 09:43:08.15ID:xTOfsl1/ 江添さんがこのスレを見てれば委員会に提案してくれるかも。
875デフォルトの名無しさん
2020/03/17(火) 12:33:47.35ID:uS/+7KOG 明示的にオーバーライドしないとできない様に制限する機能ってないの?
たまに同名同タイプで気づかずにオーバーライドしてしまった事があるんだが。
たまに同名同タイプで気づかずにオーバーライドしてしまった事があるんだが。
876デフォルトの名無しさん
2020/03/17(火) 12:54:20.37ID:ZQD4xStF 規格はコンパイラの警告は決めてない
警告機能が欲しいならコンパイラの開発者に要望を出すんだな
警告機能が欲しいならコンパイラの開発者に要望を出すんだな
877デフォルトの名無しさん
2020/03/17(火) 13:00:16.10ID:vGhk4vWX >>873
だな
だな
878デフォルトの名無しさん
2020/03/17(火) 13:22:13.65ID:Aeuh89FK >>1
アセンブリファイル出力を行うようにコンパイルオプションを設定して、自分で出力アセンブリコードを見ればいいだけ。
アセンブリファイル出力を行うようにコンパイルオプションを設定して、自分で出力アセンブリコードを見ればいいだけ。
879デフォルトの名無しさん
2020/03/17(火) 13:44:23.77ID:vGhk4vWX 意図したとおりの訳になったかどうかが問題になるのはスポットで全域じゃないからな
ただ、そういう箇所はコンパイラの出力を参考にアセンブラで書くべきだと思うが
ただ、そういう箇所はコンパイラの出力を参考にアセンブラで書くべきだと思うが
880デフォルトの名無しさん
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 を末尾再帰と言えないと死ぬ病気か何かなの?
レス数が900を超えています。1000を超えると表示できなくなるよ。
ニュース
- 【サッカー】U-17日本代表、激闘PK戦制す 北朝鮮撃破で6大会ぶり8強入り U17W杯 [久太郎★]
- 「国民の憤りを引き起こした」中国側“高市首相発言の撤回改めて要求” [どどん★]
- 【インバウンド】中国からの“渡航自粛”…ツアー1000人分の直前キャンセル「キャンセル料は免除してくれ」 ことしいっぱいキャンセルに [1ゲットロボ★]
- 【芸能】日中関係悪化でエンタメ業界に大ダメージ… JO1の中国でのイベント中止、邦画は公開延期、STARTOアイドルへの影響も [冬月記者★]
- XやChatGPTで広範囲の通信障害 投稿や閲覧できず [蚤の市★]
- 【サッカー】日本代表、ボリビアに3発快勝 森保監督通算100試合目を飾る…鎌田、町野、中村がゴール [久太郎★]
- 【J SPORTS】FIFA U-17ワールドカップ ★10
- とらせん IPあり
- 巨専】
- こいせん 全レス転載禁止
- 【ATP】テニス総合実況スレ2025 Part 211【WTA】
- ネットでサッカー観戦◆2025-29
- Perfume・あ~ちゃんの結婚相手の一般男性、吉田カバンの社長と判明 [977261419]
- 地球から無限km先の場所ってどうなっているの?
- 日本、高市のお陰で破滅に近づくwwwwwwww
- 自民党議員「高市は先人が築き上げた日中関係を壊した。外務省が謝罪に言ってるが自分で責任を取れ」 [834922174]
- 🖐( -᷄ὢ)俺に挑むのはやめておけ……実力差がありすぎる
- 岡田克也「軽々しく存立危機事態とか言うべきじゃない」高市早苗「台湾で武力攻撃が発生したらどう考えても日本の存立危機事態」 [931948549]
