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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

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

Q&A

解決済

1回答

793閲覧

[C#]C++で実現できる再帰呼び出しの処理をC#でも実現したい

shibu_t

総合スコア2

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

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

0グッド

0クリップ

投稿2020/05/03 10:41

背景

  • C++の処理をC#で書いたのですが、出力結果がC#とC++で異なってしまいました。
  • なぜC++の処理をC#で書いたかというと、普段C#で競技プログラミングをしておりC++の回答をC#で書き直したかったためです。

質問したいこと

  1. なぜC#では期待している結果(C++と同じ出力結果を期待している)が得られないのか
  2. 期待している結果をC#のコードで実現するにはどうすればよいか

C#の場合

コード

csharp

1using System; 2using System.Collections.Generic; 3using System.Linq; 4 5class Program 6{ 7 static void Main(string[] args) 8 { 9 Program obj = new Program(); 10 obj.Foo(new List<int> { 1 }); 11 } 12 13 void Foo(List<int> A) 14 { 15 if (A.Count == 10) 16 { 17 return; 18 } 19 20 A.Add(1); 21 this.Foo(A); 22 23 // print 24 foreach (var e in A) 25 { 26 Console.Write(e); 27 } 28 Console.WriteLine(); 29 } 30}

結果

1111111111

1111111111
1111111111
1111111111
1111111111
1111111111
1111111111
1111111111
1111111111

なぜか再帰呼び出しの最後に実行された値を使いまわしてしまっております。

C++の場合

コード

c++

1#include <iostream> 2#include <vector> 3#define rep(i, n) for (int i = 0; i < (n); ++i) 4using namespace std; 5using ll = long long; 6using p = pair<int, int>; 7 8void foo(vector<int> A) 9{ 10 if (A.size() == 10) 11 { 12 return; 13 } 14 15 A.push_back(1); 16 foo(A); 17 18 // print 19 rep(i, A.size()) 20 { 21 cout << A[i]; 22 } 23 cout << endl; 24} 25 26int main() 27{ 28 foo(vector<int>(1, 1)); 29}

結果

1111111111

111111111
11111111
1111111
111111
11111
1111
111
11

C#でもこちらと同等の結果を得たいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

C++は、vector<int>を(参照とせずに)引数として渡すと、コピーしての値渡しになるのに対して、C#ではクラス型は参照の値渡しになります。

C++と同じ動作をさせるには、自分でコピーを行う必要があります。

投稿2020/05/03 10:51

maisumakun

総合スコア145208

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

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

shibu_t

2020/05/03 10:59

ご指摘の通りコピーしたらできました…! ありがとうございました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問