質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1290閲覧

atcoderの問題についてです。c++で変数定義の場所を変えた際挙動が全く異なってしまいます。

wakaranna

総合スコア8

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/04/13 07:05

編集2020/04/13 07:09

atcoderのhttps://atcoder.jp/contests/abc054/tasks/abc054_cこの問題についてなんですが
int ret = 0;の定義の位置を変えると全然違う値になってしまいます。なぜでしょうか?
コード問題となっている変数の場所は下の通りです。

#include <bits/stdc++.h> using namespace std; using Graph = vector<vector<int>>; int N,M; //ここにint ret = 0;を定義すると出力の値が大きい数字(1のはずが500ぐらい)になってしまいます int dfs(const Graph &G,int v,vector<bool> visited){ bool all_visited = true; for(auto x: visited){ if(!x) all_visited = false; } if(all_visited){ return 1; } int ret = 0;//この左で定義しているものです for(auto nt :G.at(v)){ if(visited.at(nt)) continue; visited.at(nt) = true; ret += dfs(G,nt,visited); visited.at(nt) = false; } return ret; } int main(){ cin >> N >> M; Graph G(N); vector<bool> visited(N); for(int i = 0;i < M;i++){ int a,b; cin >> a >> b; G.at(a-1).push_back(b-1); G.at(b-1).push_back(a-1); } for(int i = 0; i < N ;i++){ visited.at(i) = false; } visited.at(0) = true; cout << dfs(G,0,visited) << endl; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

関数の外側で定義した変数は、プログラムの最初で1回だけ初期化されて、その後書き換えたものは残り続けます。

一方、関数内で宣言した変数は、(staticとしない限り)関数の実行ごとに初期化されます。

投稿2020/04/13 07:10

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wakaranna

2020/04/13 07:32

ありがとうございます。それが今回の場合なぜ問題となるのでしょうか? dfs(その1)の関数内で再帰の形で呼び出したdfs(その2)が、その関数内でさらに呼び出したdfs(その3)があった場合。 dfs(その3)の返り値をdfs(その2)の関数内で、ret += dfs(G,nt,visited);した際に、dfs(その1)の関数内のret += dfs(G,nt,visited);の部分の左のresも同時に書き換えられてしまっているという認識で良いということでしょうか?
maisumakun

2020/04/13 08:26 編集

ret+=なので、前に呼び出したときの値が残っていれば、結果はそこに足されます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問