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

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

詳細はこちら
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

1回答

1370閲覧

再帰のサンプルコード解読

mannmaru

総合スコア9

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2019/11/12 10:11

編集2019/11/12 13:16

processing言語で、いくつかの振り子を作るコードなのですが、

Branch [] children = new Branch[0];
の配列の長さをなぜ0にしているのか。
また
Branch(float lev, float ind, float ex, float why) {
//中略
for (int x=0; x<_numChildren; x++) {
children[x] = new Branch(level+1, x, endx, endy);
}
}
}
と再起しているところは、おそらくchildren[0]の中にchildren[0],children[1],children[2]となっていくと理解しております。
しかし、そうしますと、以降のchildren[0],children[1],,,などを呼び出す際にダブりが、生じてしまうと思います。
なぜこれで合っているのか教えていただきたいです。

int _numChildren = 3; // limit on number of branches int _maxLevels = 3; // the maximum depth Branch _trunk; // the trunk of our fractal "tree" // ======================= init void setup() { size(1500,1000); background(255); noFill(); smooth(); newTree(); } void newTree() { _trunk = new Branch(1, 0, width/2, 50); //_trunk.drawMe(); } void draw() { background(255); _trunk.updateMe(width/2, height/2); _trunk.drawMe(); } // ======================= Branch object class Branch { float level, index; float x, y; float endx, endy; float strokeW, alph; // drawing style float len, lenChange; // line length float rot, rotChange; // rotation Branch [] children = new Branch[0]; //疑問 // array of children Branch(float lev, float ind, float ex, float why) { level = lev; index = ind; strokeW = (1/level) * 10; alph = 255 / level; len = (1/level) * random(200); rot = random(360); lenChange = random(10) - 5; rotChange = random(10) - 5; updateMe(ex, why); // make children if (level < _maxLevels) { children = new Branch[_numChildren]; for (int x=0; x<_numChildren; x++) { children[x] = new Branch(level+1, x, endx, endy);//疑問 } } } void updateMe(float ex, float why) { x = ex; y = why; rot += rotChange; if (rot > 360) { rot = 0; } else if (rot < 0) { rot = 360; } len -= lenChange; if (len < 0) { lenChange *= -1; } else if (len > 200) { lenChange *= -1; } float radian = radians(rot); endx = x + (len * cos(radian)); endy = y + (len * sin(radian)); for (int i=0; i<children.length; i++) { children[i].updateMe(endx, endy); //ダブるのではないか } } void drawMe() { strokeWeight(strokeW); stroke(0, alph); fill(255, alph); line(x, y, endx, endy); ellipse(endx, endy, len/12, len/12); for (int i=0; i<children.length; i++) { children[i].drawMe(); //ダブるのではないか } } }

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

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

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

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

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

2KOH

2019/11/12 12:55

何をするプログラムなのかどころか、何のプログラミング言語かすら記述なしって、なぜこんな質問で回答が得られると思ったのか、逆に教えていただきたいです。
guest

回答1

0

ベストアンサー

しかし、そうしますと、以降のchildren[0],children[1],,,などを呼び出す際にダブりが、生じてしまうと思います。

ダブりが何を指しているのか分からなかったですが…

  • Branchを生成する度に乱数を振っているので、Branchのパラメータはダブらないと思います。
  • children[0].children[1]children[1].children[0] は異なるインスタンスを指しているはずなので、1回の draw で1つの drawMe が複数回呼ばれることは無いです

Branch [] children = new Branch[0];

の配列の長さをなぜ0にしているのか。

子が居ない Branch インスタンスを表現しているのだと思います。

children を代入しているのは、次の1箇所のみです。
level >= _maxLevels の時、すなわち最も深いBranchの時は子が居ない、という事です

java

1 Branch(float lev, float ind, float ex, float why) { 2 // 略 // 3 if (level < _maxLevels) { 4 children = new Branch[_numChildren]; 5 // 略 // 6 } 7 }

こう書くべきだったかもしれませんね。

java

1 Branch [] children; 2 3 Branch(float lev, float ind, float ex, float why) { 4 // 略 // 5 if (level < _maxLevels) { 6 children = new Branch[_numChildren]; 7 // 略 // 8 } 9 else { 10 children = new Branch[0]; 11 } 12 }

投稿2019/11/12 13:14

maai

総合スコア463

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

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

mannmaru

2019/11/15 07:42

二つとも理解できました、ありがとうございます。 ダブりというのは、言葉足らずでした。 Branch(float lev, float ind, float ex, float why) { //中略 // make children if (level < _maxLevels) { children = new Branch[_numChildren]; for (int x=0; x<_numChildren; x++) { children[x] = new Branch(level+1, x, endx, endy); } } } 上記の部分で, children[0]を生成した後、その子が、再び同じchildren[0]を作り。そしてchildren[1]、children[2]を生成するのかと思っておりました. children[0].children[0]、children[0].children[1]、children[0].children[2]l、、、と生成されていくのですね。 根本を教えていただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問