LoginSignup
1
2

More than 5 years have passed since last update.

0から9までの数をすべて足すコードを書いてみたらモヤモヤした。

Last updated at Posted at 2016-09-09

モヤモヤは解決したので、補足で説明を記載しました。

例のあの本やら記事やらを見て。もちろんダサいループは使いません。
(似たような事してるけど)

最初に投稿したけど、処理系依存で駄目過ぎた例↓

main.cpp
#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

もっと頭良い方法ありそうだと思いました、なんか絶妙に微妙。
(※ラムダで再帰はカッコよさ気に見えるけど、良い子は普通の関数で再帰しよう!)

何故上記のコードは駄目だったか。

処理が左から右に処理されるとは限らないから。

main.cpp
#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

スクリーンショット 2016-09-09 21.03.42.png

paiza.io

スクリーンショット 2016-09-09 21.00.30.png

ideone

スクリーンショット 2016-09-09 21.01.30.png

後地味にideaone広告多すぎ

iO.jpg

1
2
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2