モヤモヤは解決したので、補足で説明を記載しました。
例のあの本やら記事やらを見て。もちろんダサいループは使いません。
(似たような事してるけど)
最初に投稿したけど、処理系依存で駄目過ぎた例↓
#include <iostream>
#include <functional>
using namespace std;
int main() {
typedef std::pair<int, int> pair;
std::function<pair(pair)> proc = [&proc](pair p) {
return p.second <= 9 ? proc(make_pair(p.first+=p.second, ++p.second)) : p;
};
cout << proc(make_pair(0, 0)).first << endl;
return 0;
}
45
Program ended with exit code: 0
うーん、微妙!w
もっと頭良い方法ありそうだと思いました、なんか絶妙に微妙。
(※ラムダで再帰はカッコよさ気に見えるけど、良い子は普通の関数で再帰しよう!)
何故上記のコードは駄目だったか。
処理が左から右に処理されるとは限らないから。
#include <iostream>
#include <functional>
using namespace std;
int main() {
typedef std::pair<int, int> pair;
std::function<pair(pair)> proc = [&proc](pair p) {
return p.second <= 9 ? proc(make_pair(p.first+p.second, p.second+1)) : p;
};
cout << proc(make_pair(0, 0)).first << endl;
return 0;
}
再帰時の
proc(make_pair(p.first+p.second, p.second+1))
が米を頂いての変更点です。
proc(make_pair(p.first+=p.second, ++p.second))
の場合だと、処理系によっては 右から左に評価される場合もあります
参考:米欄 と http://www.jpcert.or.jp/sc-rules/c-exp10-c.html
なので、下記の ideone だけ出力が違う結果が出てしまっていました。
(コードの動きの説明は冗長かもしれませんが、想定せずに先にp.secondがインクリメントされてしまったという事です。)
まるで基礎が出来ていないという事が露呈されてしまった。
more feature(妄想です)
#include <iostream>
using namespace std;
int main() {
cout << [](auto p) {
return p.second <= 9 ? this(make_pair(p.first+=p.second, p.second+1)) : p;
}(make_pair(0, 0)).first << endl;
return 0;
}
こんな感じで書けたら、なんかちょっとカッコいいなとか思った。
ここからモヤモヤ ※解決済み
上記の正しく動く方のコード、
私の Xcode や paiza.io だと出力は 45 なのですが、
何故か ideone だと結果が 55 になったのがモヤモヤ。
Xcode
paiza.io
ideone
後地味にideaone広告多すぎ