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

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

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

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

Q&A

解決済

2回答

1992閲覧

【C#】【アドバイスお願いします】フィボナッチ数列を動的計画法で求める

taka10taka12

総合スコア7

C#

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

0グッド

1クリップ

投稿2021/10/23 06:07

編集2021/10/23 10:05

前提・実現したいこと

フィボナッチ数列を動的計画法を用いて求めました。
動的計画法を用いるにはメモ用の配列を用意する必要があると思うのですが、
C#ではグローバル変数が使えないため、試行錯誤して力技で実装しました。
メモ用配列の用意の仕方は下記に記載しました。
メモ用配列の用意の仕方についてアドバイス等頂けないでしょうか??

メモ用数列の用意

  1. Main関数にて、メモ用数列をlist<int>として定義(変数名:memo)
  2. Main関数にて、for文を用いて全てに-1を代入
  3. fibo関数でもMain関数で定義したmemo配列を使用するため、refを用いて参照できるようにした
  4. fibo関数にて、memo配列にメモしながら返り値を計算

該当のソースコード

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4 5namespace AtCoder 6{ 7 class Problem 8 { 9 static void Main() 10 { 11 // 何番目のフィボナッチ数列を求めたいか入力を受ける 12 var input = int.Parse(Console.ReadLine()); 13 // fibo(N)の答えをメモ化する配列を定義 14 var memo = new List<int> {}; 15 // メモ化用配列を-1で初期化する 16 for (int i = 0; i <= input; i++) 17 { 18 memo.Add(-1); 19 } 20 // n番目のフィボナッチ数列を出力 21 Console.WriteLine(fibo(input, ref memo)); 22 // 以下は確認用 23 var j = 0; 24 foreach (int num in memo) 25 { 26 Console.WriteLine("{0}番目: {1}", j, num); 27 j++; 28 } 29 } 30 31 // 再帰関数用メソッドの定義 32 static int fibo (int n, ref List<int> memo) 33 { 34 // 現在の進行状況を報告 35 Console.WriteLine("fibo({0})を呼び出しました", n); 36 37 // ベースケース 38 if (n == 0) return memo[0] = 0; 39 if (n == 1) return memo[1] = 1; 40 41 // メモをチェック 42 if (memo[n] != -1) return memo[n]; 43 44 // 再帰呼び出し 45 return memo[n] = fibo(n-1, ref memo) + fibo(n-2, ref memo); 46 } 47 } 48} 49

追記

データ専用のクラスを作成し、そのクラス内で再帰関数を呼び出すように修正しました。
アドバイスいただきありがとうございました。
以下に、修正したコードを添付します。

【修正版】ソースコード

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4 5namespace AtCoder 6{ 7 class Problem 8 { 9 static void Main() 10 { 11 // 何番目までかを受け取る 12 var input = int.Parse(Console.ReadLine()); 13 14 // memo用listを作成し、-1で初期化する 15 var data = new Data(); 16 data.Memo = new List<int>(); 17 for (int i = 0; i <= input; i++) 18 { 19 data.Memo.Add(-1); 20 } 21 22 // n番目のフィボナッチ数列を出力 23 Console.WriteLine(data.fibo(input)); 24 25 // 以下は確認用 26 var j = 0; 27 foreach (int num in data.Memo) 28 { 29 Console.WriteLine("{0}番目: {1}", j, num); 30 j++; 31 } 32 } 33 } 34 35 class Data 36 { 37 public List<int> Memo {get; set;} // memo用のlist 38 39 public int fibo(int i) 40 { 41 // ベースケース 42 if (i == 0) return Memo[i] = 0; 43 if (i == 1) return Memo[i] = 1; 44 45 // memoをチェック 46 if (Memo[i] != -1) return Memo[i]; 47 48 // 再帰呼び出し 49 return Memo[i] = fibo(i - 1) + fibo(i - 2); 50 } 51 } 52}

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

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

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

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

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

gentaro

2021/10/23 09:14

【要アドバイス】 って何様やねん、と思うけども。 余計な装飾するぐらいなら「アドバイスお願いします」って普通に書けばいいのに。
taka10taka12

2021/10/23 09:59

@gentaroさん ご指摘ありがとうございます。 すみません。言葉使いがなってませんでした。 言葉使いはこれから勉強していきます。
guest

回答2

0

refである必要はないです

投稿2021/10/23 06:18

ozwk

総合スコア13553

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

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

0

ベストアンサー

C#なら、クラスにしてインスタンス変数でmemoを持てばいい。

投稿2021/10/23 06:17

matukeso

総合スコア1681

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

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

Zuishin

2021/10/23 10:03

質問の意味も回答の意味もわからない。 何が解決したんだろう。 引数にしなくてもよくなるという意味ですか?
taka10taka12

2021/10/23 10:19

@matukesoさん アドバイスありがとうございます。 他の方から指摘があったように、聞き方が上から目線であったのにも関わらず、ご回答いただきありがとうございました。 非常に参考になりました。
Zuishin

2021/10/23 10:21

で、何が解決したの?
Zuishin

2021/11/01 02:36

で、何が解決したの? 質問者の別アカウントと見られる人からの質問が増えてるけど、この回答者もそうなの?
matukeso

2021/11/01 06:56

「他に方法あるか?」に対して「こういう方法がある」「なるほど」は(疑問の)解決では無いの?
Zuishin

2021/11/01 07:07

「他に方法あるか?」はどこにも書いていないのに、どうしてそういう質問だとわかったんですかねえ。
matukeso

2021/11/01 07:44

下記引用部分を読めばそう判断できるはずですが、、、 「C#ではグローバル変数が使えないため、試行錯誤して力技で実装しました…メモ用配列の用意の仕方についてアドバイス等頂けないでしょうか」
Zuishin

2021/11/01 09:09

なるほど、アドバイスをくれというのは、自分の使った方法の正しいとりかたを教えてくれというのではなく、まったく他の方法を教えてくれという意味だったんですね? それがよくわかりましたね。 無駄に ref を使っているのが悪いのは一目瞭然なので、それを外せばいいとい思うのが普通ですが、まさか全然別の方法を教えてくれという質問と回答だとは思いませんでした。 こういう二人だけに通じ合っている謎のやり取りと、繰り返される質問を無視しているのに、自作自演疑惑が出てきた途端になぜか急に反応したという事実とから、ある一定の疑惑がわくのはしょうがないですねえ。
matukeso

2021/11/01 09:30

自作自演、ね、、はいはいワロスワロス、妄想乙。
Zuishin

2021/11/01 09:47

やっぱりそういう所の住民か。迷惑な。
matukeso

2021/11/01 09:53

勝手にコメントに入ってきておいて「迷惑」とは摩訶不思議の物言い。迷惑なのはこっちだよ、、
Zuishin

2021/11/01 09:55

バカなことを言うな。 質問や回答に疑問があれば聞くのが当たり前で無視するのが常識外れだ。 知恵袋か。
Zuishin

2021/11/01 09:57

ローカル変数を使わないためだけにクラスを作れというこんな意味不明な糞回答で解決したなら、そりゃ疑問くらいつくだろ。
matukeso

2021/11/01 10:10

>質問の意味も回答の意味もわからない。 >で、何が解決したの? >自作自演疑惑 一体全体これのどこが「質問や回答にたいする疑問」かね。 「ローカル変数を使わないためだけにクラスを作れとか意味不明」とはじめから書けよ。 (メモ化変数とそれを使う関数ならクラスとして結合しててもいいと思った)とか話の発展もあったところ。
Zuishin

2021/11/01 10:21 編集

質問と回答に対する疑問は無視したじゃないか。 何言ってんだ。 お前が反応したのは自作自演疑惑だけだろう。 こっちはそれに返信してるだけだから、不毛な言い訳はそろそろやめたらどうかね?
matukeso

2021/11/01 10:45

えっと、まだ「何が解決したかわからない」ママですか? 本当に、「taka10taka12」=「matukeso」だとおもっているんですか? あなたの疑問を無視するのが常識外れとか、あなたどれだけ偉い人ですか?
Zuishin

2021/11/01 10:47

えっと、まだ続ける気なの? 普通の疑問はスルーしたくせに、自作自演と言われたら急にそんなことになるなんてね。
matukeso

2021/11/01 10:53

そうですね、放っておくと定期的に「何が解決したの」と云われて通知が面倒くさくなるかなとおもって反応しましたが、反応したことで余計に面倒なことになりましたね。
Zuishin

2021/11/01 10:56

放っておいたじゃないか。 何を言ってるんだか。 普通の疑問はスルーして、自作自演を指摘された時だけ顔真っ赤にしていつまでも続けてるだけだろ。面倒な。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問