🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Q&A

解決済

5回答

660閲覧

繰り返し処理について(for文、while文)- 徐々に短くなっていく配列について

marumarumaru

総合スコア17

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

0グッド

0クリップ

投稿2020/11/28 17:36

編集2020/11/28 18:01

複数の座標の入った配列があるとします。
(例:a=[1, 3, 7, 13, 25, 33])
それぞれ配列の値を隣同士で中点をとります。
この場合、1と3、3と7のように...
(例:b=[2, 5, 10, 19, 29])
これを配列の長さが1になるまで繰り返します。
(例:c=[3.5, 7.5, 14.5, 24])

(例:d=[5.5, 11, 19.25])

(例:e=[8.25, 15.125])

(例:f=[11.6875])

これをシンプルなループ処理でかくとどのようになるでしょうか??
最初に与えられる配列の長さが変わっても対応できるような処理を書きたいです。

言語はc#で書いていますが、構造の問題だとおもうので、何の言語でも構いません。

よろしくお願いいたします。

追記:
自分ではfor文への仕方がわからず、それぞれの配列をベタ書きで書いていく方法しかわかりませんでした...

a0 = (a[0] + a [1]) /2 a1 = (a[1] + a [2]) /2 a2 = (a[2] + a [3]) /2 a3 = (a[3] + a [4]) /2 a4 = (a[4] + a [5]) /2 b1 = (a0 + a1) /2 b2 = (a1 + a2) /2 ...

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

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

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

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

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

miyabi_takatsuk

2020/11/28 17:53

まず、自身でやってみたコードはないのでしょうか? まず、自身でどうやったか記載しないと丸投げになると思いますよ。
marumarumaru

2020/11/28 17:59

すみません。 追記しましたが、自分ではfor文にへのやり方がわからずじまいでした。
miyabi_takatsuk

2020/11/28 18:12

なるほど・・・。 わからなくなるのは、いいとして、 まずはfor文なりwhileなりを、自分で使ってみてやってみたらいかがでしょうか? わからない、と言って、まずやりもしないで、人から答えをもらったら、ますますわからないままだと思いますよ?
Zuishin

2020/11/28 22:59

for を使いさえすれば何の言語でも構わないということですね?
marumarumaru

2020/11/29 03:01

@Zuishin はい!そういう意味です!
guest

回答5

0

係数がパスカルの三角形で求められることに着目して C# で解いてみました。

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4 5namespace ConsoleApp1 6{ 7 class Program 8 { 9 // n 個の要素から k 個選択する組み合わせの数を求める 10 static int Combination(int n, int k) 11 { 12 if (n <= 1 || k <= 0) return 1; 13 return n * Combination(n - 1, k - 1) / k; 14 } 15 16 // パスカルの三角形の第 n 段を求める 17 static IEnumerable<int> GetCoefficients(int n) 18 { 19 for (int i = 0; i <= n; i++) 20 { 21 yield return Combination(n, i); 22 } 23 } 24 25 // 解を求める 26 static double Calc(params double[] args) 27 { 28 var coefficients = GetCoefficients(args.Length - 1); 29 return args.Zip(coefficients, (a, b) => a * b).Sum() / Math.Pow(2, args.Length - 1); 30 } 31 32 static void Main(string[] args) 33 { 34 Console.WriteLine(Calc(1, 3, 7, 13, 25, 33)); 35 } 36 } 37}

追記

1, 3, 7, 13, 25, 33 の場合、要素数が 6 つなのでパスカルの三角形の第 6 段(0 ベースで第 5 段)を使います。0 ベースでの第 5 段は 1, 5, 10, 10, 5, 1 で、それぞれの対応する要素同士を乗じたものを 2 の 5 乗で割ったものが解です。
(1 * 1 + 3 * 5 + 7 * 10 + 13 * 10 + 25 * 5 + 33 * 1) / 32 = 11.6875 となります。

投稿2020/11/29 03:50

編集2020/11/29 03:58
Zuishin

総合スコア28669

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

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

marumarumaru

2020/11/29 04:03

斬新な支店でめちゃくちゃわかりやすいです、ありがとうございました!
Zuishin

2020/11/29 04:07

完全に興味本位のチャレンジで、可読性もパフォーマンスも悪いものですが、この解説でわかりやすいというのはすごいです。
miyabi_takatsuk

2020/11/29 05:45 編集

ほぼほぼ数学… 私は数学をプログラミングに起こしたのか?程度の理解しかできませんでした。 質問者さん、これ理解できるなら、なぜ今回の質問に至ったのでしょう・・・。
marumarumaru

2020/11/29 12:57

エンジニアではなく、普段は紙とペンしか使わない数学屋さんなので...
Zuishin

2020/11/29 13:46

再帰とかジェネレーターとか LINQ とか可変長引数とか使っているので、ただの数学屋さんには難しいと思いましたけど。逆に Σ や階乗や微分積分を知ってる数学屋さんが for も while もわからないというのがよくわかりません。
guest

0

遅刻した……。
C#でLINQを使う例(をさらに短くした)。

C#

1var target = new double[] {1, 3, 7, 13, 25, 33}; 2while (target.Length > 1) { 3 target = target.Skip(1).Zip(target, (x, y) => (x + y) / 2).ToArray(); 4} 5Console.WriteLine(target[0]);

補足: 毎回の処理で、「配列の先頭から末尾のひとつ手前までの要素」のスライスと、「配列の2番目から末尾までの要素」のスライスがそれぞれ得られれば、それらをZipして「対応する2つの要素の値を足して2で割る」という処理に単純化できる。
「配列の先頭から末尾のひとつ手前までの要素」のスライスは、Takeによる個数の指定、「配列の2番目から末尾までの要素」のスライスは、Skipによる読み飛ばしで実現可能なので、LINQのメソッドチェーンで処理が完了する。
修正: さらに、LINQのZipは、「シーケンスの要素の少ない方の分だけ処理する(はみでた要素は処理されない)」という仕様なので、Takeを省略してさらに短く書くことができる。

投稿2020/11/29 03:48

編集2020/11/29 04:16
Daregada

総合スコア11990

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

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

marumarumaru

2020/11/29 04:04

なるほど!思いつきませんでした。ありがとうございました!参考にさせていただきます
guest

0

ベストアンサー

Python

1a=[1, 3, 7, 13, 25, 33] 2while (len(a) > 1): 3 a = [(a[i-1] + a[i]) / 2 for i in range(1, len(a))] 4 5print(a) # [11.6875]

投稿2020/11/29 03:31

lehshell

総合スコア1156

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

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

marumarumaru

2020/11/29 03:41

ご回答ありがとうございます。 仕組みが理解できました。
guest

0

配列の長さが1になるまで繰り返す

言い換えれば、配列の長さが1より大きい場合に繰り返す、ですから、

array.length>1 ってのを、while文の条件式にすればいいということになります

投稿2020/11/28 22:25

y_waiwai

総合スコア88038

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

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

marumarumaru

2020/11/29 03:41

ご回答ありがとうございます。 仕組みが理解できました!
guest

0

JavaScriptです。

javascript

1const arr = [1, 3, 7, 13, 25, 33]; 2 3const calcArr = arrInner => { 4 return arrInner.length == 1 ? arrInner : calcArr( 5 arrInner.map( (elm, index, parent) => 6 typeof parent[index + 1] == 'undefined' ? null : (elm + parent[index + 1]) / 2 7 ).filter( elm => elm ) 8 ); 9}; 10 11const result = calcArr(arr); 12console.log(result); // [11.6875]

for考え方は使っていますが、
再帰的処理でなるたけ短く処理することを念頭にしています。
C#でももちろんできますが、
静的型づけのため、JS(JSは動的型づけ)とはやり方は異なると思います。
また、配列に対してのメソッドも言語によって違うため、
(JSでの配列メソッド、mapfilterメソッドを使っている。C#でも似たメソッドはあると思われる)
やはり、言語によってやり方は大なり小なり違います。

投稿2020/11/28 18:43

編集2020/11/28 18:47
miyabi_takatsuk

総合スコア9555

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

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

marumarumaru

2020/11/29 03:05

ご回答ありがとうございます。 仕組みが理解できました。
miyabi_takatsuk

2020/11/29 03:17

解決したならBA選出か、自己解決の投稿をして質問を閉じましょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問