FX取引

フィボナッチ数列は再帰関数の題材として適切なのか

フィボナッチ数列は再帰関数の題材として適切なのか
大石ゆかり

再帰アルゴリズム

再帰は、「n-1までが正しいと仮定したら、nの場合も正しいことを証明すれば、すべてのときに正しいといえる」という数学的帰納法と似た考え方です。nでの問題をn-1での結果を用いて解くアルゴリズムを考えればよいのです。
そのため、再帰アルゴリズムを用いることには、次のような利点があります。
・アルゴリズムを発見しやすくなる。
→プログラムが作りやすい。
・一般に、アルゴリズムが簡素になる。
→プログラムの誤りが少なくなる。
他人が読んでわかりやすいプログラムになる。
このような利点を実感するために、代表例として、「ソート」と「ハノイの塔」を後述します。

しかし、プログラムが簡潔であることは、必ずしも実行効率がよいことではありません。イのプログラムで f(5) をを実行するには、f(4),f(3),…,f(3) を実行しなければないません。関数を呼び出す回数が増加しますし、それらの結果を保存しておく必要があります。処理のための時間やメモリ容量は、むしろ増大してしまいます。その代表的な例として「フィボナッチ数列」を後述します。

配列aを小さい順にソートすることを考えます。これまでに、n-1個までは既にソートされているとき、要素a[n] について考えます。
1 2 3 n-1 n
┌──┬──┬──┬──┬──┐┌──┐
│10│20│40│50│60││a[i]│
└──┴──┴──┴──┴──┘└──┘

  1. a[n] の値30を一時的にwに保管しておきます。
  2. 配列の先頭から順にa[i] ≧a[n] フィボナッチ数列は再帰関数の題材として適切なのか の間iをずらしていき、a[i] <a[n] となる個所iを見つけます。(図ではi=3)
  3. 要素i~n-1を右に1つずらして、i+1~nに入れます。このとき右のほうからずらさないと、データが消えてしまいます。
  4. a[n] の値を保管していたwの値を a[i] に入れます。

ハノイの塔

かなり難解な問題が再帰を用いることにより、非常に簡単になる例として、「ハノイの塔」があります。
図のように、右の棒にn枚の円盤が積んであります。
・1回に1枚の円盤しか動かせない。
・小さい円板の上に大きい方の円盤を置いてはならない。
の規則に従って,円盤をAからBに移動せよという問題です。

プログラム 再帰を用いたプログラムは非常に簡単です。
ここでは円盤の小さい順に円盤番号nをつけています。

function hanoi(フィボナッチ数列は再帰関数の題材として適切なのか フィボナッチ数列は再帰関数の題材として適切なのか n, a, b, c) if (n==0) return;
hanoi(n-1, a, c, b);
document.write("円盤" + フィボナッチ数列は再帰関数の題材として適切なのか n + ": " + a + " → " + b + "
");
hanoi(n-1, c, b, a);
>

「hanoi(4, "左", "中", "右")」を実行した結果を示します。
ア 円板1: 左 → 右
イ 円板2: 左 → 中 フィボナッチ数列は再帰関数の題材として適切なのか
ウ 円板1: 右 → 中
エ 円板3: 左 → 右
オ 円板1: 中 → 左
カ 円板2: 中 → 右
キ 円板1: 左 → 右
ク 円板4: 左 → 中
ケ 円板1: フィボナッチ数列は再帰関数の題材として適切なのか 右 → 中 ─┐
コ 円板2: 右 → 左 │
サ 円板1: 中 → 左 │ フィボナッチ数列は再帰関数の題材として適切なのか フィボナッチ数列は再帰関数の題材として適切なのか
シ 円板3: 右 → 中 │n=3
ス 円板1: 左 → 右 ─┐ │
セ 円板2: 左 フィボナッチ数列は再帰関数の題材として適切なのか → 中 │n=2 │
ソ 円板1: 右 → 中 ─┘ ─┘

円盤がn個あるとき、1~n-1の円盤を一つの円盤であるとして、1~n-1の円盤をP、n番目の円盤をQとすれば、2個の円盤を移動することだと考えることができます。
2つの円盤PとQがaの棒にあるとして、それをbの棒に正しく移動するには、次の3つの操作を行えばよいことは明白です(左中右などの物理的意味を排除するために、あえてa,b,cとします)。
操作1:PをAからCへ移動
操作2:QをAからBへ移動
操作3:PをCからBへ移動

hanoi(m, フィボナッチ数列は再帰関数の題材として適切なのか a, b, c) とは、aからbへ移動することだと定義すれば、document.write(~)がそれにあたります。
そして、Pの移動とはn-1のときの移動のことですから、
操作1:hanoi(n-1, a, c, b);
操作3:hanoi(n-1, c, b, a);
となります。

フィボナッチ数列

再帰による処理効率の低下の例(再帰を使うべきではない例)として有名なのがフィボナッチ数列です。フィボナッチ数列とは、
1,1,2,3,5,8,13,21,…
の数列で、1+1=2,1+2=3,2+3=5のように、直近の2つの数を加えたものです。それで、
┌1 (n=1のとき)
F(n)=│1 (n=2のとき)
└F(n-1) + F(n-2) (n≧3のとき)
と定義できます。

再帰を用いないならば、1つ前の数をx1,2つ前の数をx2として、プログラムf1にすることができます。 フィボナッチ数列は再帰関数の題材として適切なのか
function f1(n);
if (n
となります。

再帰を用いたプログラムf2は、
function f2(n);
if (n
となります。

計算量を forループ のなかの3つで代表させるならば、f1での計算回数は、3n回です。
それに対してf2の計算回数は、ほぼフィボナッチ数列での値と同じ程度の回数になります。
nが大きい場合、例えばn=30のときでは、f2ならば90回なのに、f1では(n=30のフィボナッチ数は)832,040回になってしまいます。

greymd / yamaya_fib.md

length の個所には -~$? という記載がある。 ここで、文頭に記載されていた ! が効果を発揮する。 ! を記述することで、前回実行したコロン : コマンドの終了ステータスの真偽が逆転する。 通常は 0 なのが、 1 となる。 そのため、前回のコマンドの終了ステータスを取得する $? は 1 が格納される。 また、先程の変数展開の position および length の個所にはbashの算術式が使える。 これは一般的にはあまり知られていないが一応 Documented (マニュアル上言及があるもの) である。 ※1

そのため -~$? のうち - はマイナス、 ~ はチルダ展開ではなくビット反転を表す。 $? は1なので、この表現は2の補数を考慮すると 2 と等価となる。

変数 cmd (元ネタでは _____ ) の中身には bc フィボナッチ数列は再帰関数の題材として適切なのか という文字列が入ることがわかった。

この2行目でやっていることは至極単純である。 fibs という変数に a+=b,b=a-b,a<_[$($cmd<<<$b>&$[-~1])]||fibs という文字列を代入している。 以上といえば以上だが、もう少し簡単に噛み砕く。 この変数の内容は、後に算術式上で実行される。 そのため、算術式の文法に沿って記述されている。 なので a や b の変数には フィボナッチ数列は再帰関数の題材として適切なのか $ がつかない。

算術式ではカンマ , で区切ることによって、式を逐次実行できる。 bashのセミコロン ; で作るリストとイメージは近い。 改行とスペースで見やすくする。

という意味になる。 なお、このときの _ は $_ とは関係ないので、変数名は何でも良い。 とりあえず c とおく。

次に問題なのが c の要素番号が入るべき個所である。 フィボナッチ数列は再帰関数の題材として適切なのか フィボナッチ数列は再帰関数の題材として適切なのか これは算術式の文法ではなく、ただのコマンド置換 $(. ) である。 算術式中ではコマンド置換の利用ができるので、ここまでは不思議なことではない。 ただし、変数名には $ をつける必要がある。

先述の通り、 $cmd には bc が入る。 $b には出力するべきフィボナッチ数列。 そして >& はリダイレクトであり、そのリダイレクトの対象となるファイルディスクリプタの番号に $[-~1] という記載がある。 $[. ] は非推奨であるがこれもbashの算術式であり、 $(( . )) と等価。 -~1 は 2 と等価なので $[-~1] は 2 である。 つまりコマンド置換の個所はこう読み替えられる。

このコマンド置換の中身では、 bc コマンドに数値を渡して、標準エラー出力に出す、ということをしている。 bc は入力された数値をそのまま出力するのでこれは動く。 ということで、2行目全体はこのように読み替えることができる。

-~$? は終了ステータスのビット反転の符号を反転させたもの。 前回のコマンドはただの変数への文字列の代入なので、 $? は 0 となる。 下記のように -~0 は 1 なので、 a には 1 が入る。

また cmd は bc なので、下記のように読み替えられる。

a に 1 を代入したあと、 fibs という変数を記載している。 このように算術式に変数を記載すると、その変数の内容が再評価される。

つまり2行目にあった fibs の中身である

が算術式として実行されることを意味する。 a の初期値は1、算術式では未定義の変数は0扱いなので b の初期値は0となるが、すぐに1となる。 そして、 c[. ] の個所を評価する段階でコマンド置換 $(. ) の中身が実行され、エラー出力として変数 b の内容が bc コマンド経由で出力される。 なお、コマンド置換自体は標準出力の内容をエラー出力に流されているため、何も結果として返さない。 そのため、 フィボナッチ数列は再帰関数の題材として適切なのか c[. ] の中身は存在しないため、こんな状態となるように一見見える。

しかし、下記に示すようにこれは本来文法エラーである。

しかしこの例の場合は動いてしまう。 直接算術式に記述するとコマンド置換が評価されてしまい、文法エラーとなるが、 一旦変数に代入して再評価することで、このエラーを避けることができる。

この事象は、シェルのコマンド置換と算術式の評価順序が関連している。 そのまま実行すると、コマンド置換の個所が先に評価され、空文字(というより文法上存在しないものと等価)となってしまうため、 c[] が評価されてしまい、シンタックスエラーとなる。 しかし、一旦変数に代入して評価することで、カレントシェルの評価の影響を避け、純粋にBashの算術式として評価させることができる。

また、算術式中で標準出力を全く伴わないコマンド置換は 0 と等価となる。 未定義のシェル変数についてならまだしも、コマンド置換のこんな挙動については当然のごとく Undocumanted (資料上説明がないもの)であるが、下記のようにして検証ができる。

c[$(. )] の個所は文法エラーを避けるよう評価することで c[0] として扱われることがわかった。 次の問題は、これは比較演算子上どう扱われるか?ということだ。

このような重箱の隅をつついた挙動は当然のごとく Undocumented である。 しかし、一応、算術式上でnullや未定義のシェル変数は 0 と等価であることがDocumentedである。 未定義の配列の1要素である c[0] が、未定義のシェル変数と等価の挙動をするかどうかについてはわからないが、シェルの文法を考えれば等価な挙動をすると考えるのが自然であろう。 この仮説が正しければ、シェルの文法上 c[0] フィボナッチ数列は再帰関数の題材として適切なのか フィボナッチ数列は再帰関数の題材として適切なのか フィボナッチ数列は再帰関数の題材として適切なのか は 0 と等価となる※2

そして、現にこれは、0として扱われる。

通常 a は1以上なので、終了条件がおとずれないように見えるかもしれない。 しかし a はいずれオーバーフローを起こすので(64bit環境であれば9223372036854775807が最大)、いずれ負の数となる。

最後に、標準出力/エラー出力共々、 bc コマンドに渡している。 bc コマンドはそのまま数値を標準出力に表示してくれる。 標準出力はシェル芸botのツイート対象となるため、フィボナッチ数列のツイートが表示された、という流れになる。 実は bc コマンドは全く計算ロジックに入ってこない。 単なる echo 代わりに使われているというオチであった。

bashでは配列の要素数を数える際に $ ( var は変数名)という記法を使う。 こんな感じ。

文法上は $ は $? の文字数を、 $ は $# の文字数をカウントする。 そのため、文字列として1文字以上を入れると1以外になり得る。

ご存知の通り $? は終了ステータスであり、 $# は引数の数として利用されている。 そのため、多くの場合は 1 と等価ではあるが、例外もあることがわかる。

$ は引数の数をカウントする際に使える。よくシェルスクリプトを書く人には $# の方が馴染みがあるかもしれない。 $ はそのシェルで渡されたオプションの個数をカウントする際に使える。

※1: [2019/09/02追記] 3.5.3 Shell Parameter Expansion より "length and offset are arithmetic expressions (see Shell Arithmetic)." フィボナッチ数列は再帰関数の題材として適切なのか thanks @qwertanus

※2: [2019/09/03追記] @qwertanus さんからの指摘があり修正しました。

※3: 6.5 Shell Arithmetic "A shell variable that is null or unset evaluates to 0 when referenced by name without using the parameter expansion syntax."

整数の公式でフィボナッチ数列を求める

よって、もし \(m = \left(\begin 1 & 1 \\ 1 & 0 \end \right)^n\) なら、 \(フィボナッチ数列は再帰関数の題材として適切なのか bn = m\\) になります(Pythonと違って、行列の添え字は通常1が基準になることに注意してください)。 NumPy行列のべき乗が繰り返し二乗法のような振る舞いをすると想定すると、計算量は \(O(\mathrm\ n)\) になります。 さらに、漸化式を解くために、閉じた式を見つける方法もあります。 これにより、次の実数値の公式が導かれます: \(\phi = (1 + \sqrt) / 2\) 、 \(\psi = (1 - \sqrt) / 2\) とすると、 \(\mathrm(n) = (\phi^ - \psi^) / \sqrt)\) 。 この手法には、任意精度の実数計算を要するという実用上の欠点がありますが、 \(n\) の値が小さければ問題はありません。

任意の数列 \(an\) の母関数は、 \(\Sigman anx^n\) の無限和です。フィボナッチ数列の場合は \(\Sigman \mathrm(n)x^n\) になります。つまり、これは無限に続くべき級数であり、 \(x^n\) の係数は \(n\) 番目のフィボナッチ数に相当します。

この式に \(x^\) をかけて \(n\) 全体で和をとると、以下の式が得られます。

\(F(x)\) を \(\mathrm\) の母関数として、それを \(\Sigma_n\mathrm(n)x^n\) と定義すると、上の式は次のように簡略化できます。

\[F(x) - x - 1 = x(F(x) - 1) + x^2F(x)\]

\[F(x) = xF(x) + x^2F(x) + 1\]

これを \(F\) について解くと以下の式が得られます。

整数の公式

まずは、この公式を直感的にとらえるため、 \(10^\) で母関数 \(F\) を評価してみましょう。

興味深いことに、小数展開した部分に \(1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89\) と、フィボナッチ数列が現れています。魔法のような結果に驚いてしまいますが、その理由は次の式から分かります。

\(F(10^) = \mathrm(0) + \mathrm(1)/10^3 + \mathrm(2)/10^6 + \mathrm(3)/10^9 + \ldots\)

この例では、フィボナッチ数列が次々と \(1/1000\) 倍されて並んでいきます。つまり、その値が一旦1000を超えると、隣り合う数に影響を及ぼし始めるということです。この現象は、上記の \(F(10^)\) の計算で988から確認できます。正しいフィボナッチ数は987ですが、数列の次の数から1だけオーバーフローが発生しています。その結果Off-by-oneエラーが発生し、以降はパターンが崩れてしまうのです。

しかし、いかなる \(n\) の値に対しても、10の負の指数を十分大きく取れば、たとえオーバーフローが発生したとしても、 \(n\) 番目のフィボナッチ数に悪影響が出ることはありません。ここでは、ある \(k\) という値について \(10^\) が妥当な値になると仮定しましょう。この値は後ほど選定します。

さらに整数で計算をしたいので(その方がコーディングしやすいので)、全体を \(10^\) 倍して \(n\) 番目のフィボナッチ数が整数の範囲にくるようにして、式を整理します。

この結果を \(10^k\) を法として見ると、 \(n\) 番目のフィボナッチ数が得られます(先ほども書きましたが、 \(k\) には十分大きな値を選んだものと想定しています)。

あとは \(\mathrm(n+1)\) \(2^k\) になるように、 フィボナッチ数列は再帰関数の題材として適切なのか \(k\) を十分大きく取るだけです。フィボナッチ数列は \(\phi^n\) のように増大して、 \(\phi\) < \(2\) なので、 \(k = n+1\) とすれば安全です。

非反復型で閉じた解が得られたのは興味深いですが、これは全く実用的な手法ではありません。ここではサイズが \( O(n^2) \) ビットの整数を用いて、整数演算を実行しています。でも実際には、最終的にビット単位で論理積を取る前に、最初の \( n \) 個のフィボナッチ数が全て連結した整数値を取得しているのです。

実際に書いてみる!Javaで階乗の計算を行う方法【初心者向け】

田島悠介

大石ゆかり

田島悠介

大石ゆかり

階乗計算の書き方

例えば1から5までを掛け合わせた結果は5の階乗といい、 5! と書き表します。

5!は「 1 × 2 × 3 × 4 × 5 」なので「 120 」となります。この階乗の計算をプログラムで行う場合、計算メソッドを再帰処理と呼ばれる形で作成することができます。

その場合、まず、このメソッドは 3 と factorial(2) の返す値の積を返そうとします。

次に、factorial(2)は 2 と factorial(1) の返す値の積を、更に次に、factorial(1)は 1 と factorial(0) の返す値の積を、そして、factorial(0)がif文の中に入り、 1 を返します。

これにより具体的には「 1 × 1 × 2 × 3 」の計算が行われます。

引数が変わっても、5であれば「 フィボナッチ数列は再帰関数の題材として適切なのか 1 × 1 × 2 × 3 × 4 × 5 」が引数が変わっても、10であれば「 1 × 1 × フィボナッチ数列は再帰関数の題材として適切なのか 2 × 3 … 8 × 9 × 10 」の計算が行われます。

引数が 0 の時に1を返すのは、数学的に0の階乗は1と定められているからです。

実際に書いてみよう

監修してくれたメンター

大石ゆかり

田島悠介

大石ゆかり

初心者・未経験でもできる。まずはテックアカデミーに相談しよう

  • ・調べてもほしい情報が見つからない
  • ・独学のスキルが実際の業務で通用するのか不安
  • ・目標への学習プランがわからず、迷子になりそう

テックアカデミーでは、このような 学習に不安を抱えている方へ、現役エンジニア講師とマンツーマンで相談できる機会を無料で提供 しています。
30分間、オンラインでどんなことでも質問し放題です。

「受けてよかった」と感じていただけるよう 厳しい試験を通過した講師 があなたの相談に真摯に向き合います。

「ただ気になることを相談したい」
「漠然としているがプロの話を聞いてみたい」
こんな気持ちでも大丈夫です。

無理な勧誘は一切ありません ので、まずはお気軽にご参加ください。
※体験用のカリキュラムも無料で配布いたします。(1週間限定)

記事を検索

関連するキーワード

関連する記事

JavaでのCSV出力の方法を現役エンジニアが解説【初心者向け】

Javaのsubstring関数で文字列を指定バイト数だけ切り出す方法を現役エンジニアが解説【初心者向け】

JavaのObject.waitメソッドの使い方【初心者向け】

Javaの値渡しと参照渡しの使用方法について現役エンジニアが解説【初心者向け】

Javaで16進数を10進数に変換する方法を現役エンジニアが解説【初心者向け】

Javaのif文を使って条件分岐する方法【初心者向け】

あわせてよく読まれている記事

JavaのBigIntegerクラスの使い方を現役エンジニアが解説【初心者向け】 フィボナッチ数列は再帰関数の題材として適切なのか

JavaのBigIntegerクラスの使い方について解説します。 実際にプログラムを書いて説明しているので、ぜひ理解しておきましょう。 そもそもJavaについてよく分からないという方は、Javaとは何なのか解説した記事を読むとさらに理解が深まります。 なお本記事は、TechAcademyのオンラインブートキャンプJava講座の内容をもとに作成しています。 田島悠介 今回は、Javaに関する内容だね! 大石ゆかり どういう内容でしょうか? 田島悠介 BigIntegerクラスの使い方について詳しく説明していくね! 大石ゆかり お願いします! BigIntegerクラスとは BigIntegerクラスはJavaで数学的な処理をする際に、扱う数値がプリミティブデータ型では扱えない程大きい場合に利用します。プリミティブデータ型のlongの最大値は9223372036854775807です。 例えば100の階乗(100×99×98…×3×2×1)は158桁にもおよび、このような値は巨大すぎてそれを格納できるプリミティブデータ型がありません。プリミティブデータ型には格納することができませんが、BigIntegerクラスには格納することができます。 情報を格納するためのメモリは動的に割り当てられるため、論理的にはBigIntegerクラスに格納できる値に上限はなく、精度は任意です。 フィボナッチ数列は再帰関数の題材として適切なのか BigIntegerクラスの使い方 BigIntegerクラスはjava.mathパッケージに属しており、java.lang.Mathクラスが提供するメソッドと同等のものを提供しています。 代表的なものは以下です。 add(BigInteger val)メソッド:加算処理を行います subtract(BigInteger val)メソッド:減算処理を行います multiply(BigInteger val):乗算処理を行います divide(BigInteger val)メソッド:除算処理を行います また、基本データ型への変換メソッドも提供されています。intValue()メソッドはBigIntegerクラスの値をint型へした変換値を返却します。 そしてintに変換する際に桁落ちなどで失われた情報がないかどうかを確認するのがintValueExact()メソッドです。int型の範囲から外れている場合は、ArithmeticExceptionを返却します。 [PR] Javaプログラミングで挫折しない学習方法を動画で公開中実際に書いてみよう 100の階乗を計算するプログラムです。 import java.math.フィボナッチ数列は再帰関数の題材として適切なのか BigInteger; public class Sample < public static void main(String args[]) throws Exception < int N = 100; System.out.println(kaijyou(N)); >// 引数の階乗を計算して返却する static BigInteger kaijyou(int num) < // 結果を格納する変数(1を格納) BigInteger result = BigInteger.ONE;

Pythonで再帰的な関数を利用してフィボナッチ数列を実装する方法を現役エンジニアが解説【初心者向け】

Pythonで再帰的な関数を利用してフィボナッチ数列を実装する方法について、TechAcademyのメンター(現役エンジニア)が実際のコードを記述し、初心者向けに解説します。 Pythonについてそもそもよく分からないという方は、Pythonとは何なのか解説した記事を読むとさらに理解が深まるでしょう。 なお本記事は、TechAcademyのオンラインブートキャンプ、Python講座の内容をもとに紹介しています。 田島悠介 今回は、Pythonに関する内容だね! 大石ゆかり どういう内容でしょうか? 田島悠介 Pythonで再帰的な関数を利用してフィボナッチ数列を実装する方法について詳しく説明していくね! 大石ゆかり お願いします! フィボナッチ数列とは フィボナッチ数列とは、「1番目と2番目の数値は 1であり、3番目以降の数値は直前の2数の和である数列」のことです。 言葉ではイメージできないものの、具体的に書くと以下のような数列になります。 1, 1, 2, 3, 5, フィボナッチ数列は再帰関数の題材として適切なのか 8, 13, 21, 34, 55, 89, 144, 233…. 例えば3番目の数値は1+1=2、4番目の数値は1+2=3のようにして算出されています。 フィボナッチ数列は、再帰的な関数を利用して作成することが可能です。 再帰とは 再帰とは、簡単に言うと「プログラム上で再度呼び出すこと」を指します。 例えば、nの階乗を計算する場合を考えてみましょう。 階乗とは自然数を階段のように掛け算する計算のことであり、5の階乗であれば5・4・3・2・1=120となります。 階乗の計算は、以下のコードのように関数を再帰的に呼び出して実行することが可能です。 #nの階乗を算出する関数 def factorial(n): if n <= 1: return 1 else: return n*factorial(n-1) コードを見ると、factorial関数の戻り値に同じ関数が用いられています。 関数の中で再度呼び出すことで、階乗の計算が表現できます。 それでは実際に具体的な数値を用いて関数をコールしてみましょう。 >>>factorial(6) 720 6・5・4・3・2・1=720なので、正しい結果が得られていることが証明できます。 また、nが1以下の時は1が戻り値となるので、factorial(1)が呼ばれた時に再帰は途絶えます。 [PR] Javaプログラミングで挫折しない学習方法を動画で公開中再帰的な関数を利用してフィボナッチ数列を実装してみよう 再帰的な関数を利用して、フィボナッチ数列を実装してみましょう。 コードは以下のようになります。 def fibonacci(n): if n <= 2:

PHPで再帰処理を実装する方法を現役エンジニアが解説【初心者向け】

今回は、PHPで再帰処理を実装する方法について、TechAcademyのメンター(現役エンジニア)が実際のコードを使用して初心者向けに解説します。 PHPについてそもそもよく分からないという方は、PHPとは何なのか解説した記事を読むとさらに理解が深まるでしょう。 なお本記事は、TechAcademyのオンラインブートキャンプPHP/Laravel講座の内容をもとに紹介しています。 田島悠介 今回は、PHPに関する内容だね! 大石ゆかり どういう内容でしょうか? 田島悠介 PHPで再帰処理を実装する方法について詳しく説明していくね! 大石ゆかり お願いします! この記事ではPHPで再起処理を実装する方法について解説します。 目次 再帰とは 再帰関数の使い方 再帰処理の例 実際に書いてみよう まとめ 再帰とは 再帰処理とは、関数がメソッドの中で自分自身を呼び出す処理のことです。 再帰処理は自分自身を呼び出すため適切な終了処理をしない限り無限ループになってしまう点に注意する必要があります。 [PR] Javaプログラミングで挫折しない学習方法を動画で公開中再帰関数の使い方 再帰関数は関数の中に自分自身を呼び出すことをいいます。ただそのままだと無限に自分自身を呼び出し続けるため終了条件が必要になります。 再帰関数は以下のように書きます。 function 関数名(引数) < if (終了条件) < return 戻り値; >else < 関数名(引数); return 戻り値; >> 自分自身を再度呼ぶ際に同じ引数を設定すると無限ループになるため引数を別の値に変えるようにする必要があります。 再帰処理の例 再帰処理の例として階乗の計算について紹介します。 階乗とは数学の計算方法の1つで4!や5!のように「数字!」と書きます。1から数字までの整数を掛け合わせた値を得ることができます。 6!だと以下のような計算になります。 6! = 1 * 2 * 3 * 4 * 5 * 6; ただこの計算はこのような理解もできます。 6! = 5! * 6; 6! = (4! * 5) * 6 6! = ((3! * 4) * 5) *

JavaScriptでの再帰関数の書き方を現役エンジニアが解説【初心者向け】

JavaScriptでの再帰関数の書き方について解説します。 フィボナッチ数列は再帰関数の題材として適切なのか 実際のコードをもとに解説していきますので、理解を深めていきましょう。 また、入門向けのJavaSriptを学習できるサイトも紹介しているので、合わせてご覧ください。 そもそもJavaScriptについてよく分からないという方は、JavaScriptとは何なのかについて解説した記事を読むとさらに理解が深まります。 なお本記事は、TechAcademyのオンラインブートキャンプJavaScript/jQuery講座の内容をもとにしています。 田島悠介 今回は、JavaScriptに関する内容だね! 大石ゆかり どういう内容でしょうか? 田島悠介 JavaScriptでの再帰関数の書き方について詳しく説明していくね! 大石ゆかり お願いします! 再帰関数とは 再帰関数とは、関数の処理の中で自分自身を呼び出す関数のことを指します。 マスターすれば、コードをもっとスッキリできます。 再帰関数を使用するのには、2つ注意点があります。 停止条件を設定すること 繰り返すたびに状態が変化すること この2つを満たさない再帰関数は、無限ループに陥るので作る際には気をつけてください。 JavaScriptでの再帰関数の書き方 JavaScriptで再帰関数を作るのに特別な手法は必要ありません。 以下のように書いて、関数の中で関数自身を呼ぶことで作成できます。 function sum(n) < if (n 3 + sum(2) =>3 + 2 + sum(1) => 3 + 2 + 1 = 6 となります。 このようにして、再帰関数によって総和を計算できます。 1~nまでの階乗を求める方法 階乗の場合も同様です。n-1で自身を呼び出すことで階乗を計算できます。 以下のように書いてみましょう。 function multi(n) < if(n 3 * multi(2) =>3 * 2 * multi(1) => 3 * 2 * 1 = 6 となります。 コラム フィボナッチ数列は再帰関数の題材として適切なのか フィボナッチ数列は再帰関数の題材として適切なのか 実は私も!?独学で損する人の特徴 「スクールは高いから独学で成功する」という気持ちの方は多いと思います。

Javaで文字列の空白を削除する方法を現役エンジニアが解説【初心者向け】

Javaで文字列の空白を削除する方法について、テックアカデミーのメンター(現役エンジニア)が実際のコードを使用して初心者向けに解説します。 入力された名前や電話番号に含まれる不要な空白文字を削除する方法が分かります。 目次階乗計算の書き方実際に書いてみよう監修してくれたメンター そもそもJavaについてよく分からないという方は、Javaとは何なのか解説した記事を読むとさらに理解が深まります。 大石ゆかり 名前を入力させるプログラムを作っているんですが、余分なスペースが入っていてデータがそろわないんです・・・ 山田 太郎 , 山田 花子, 山田 三郎 田島悠介 それは大変だね。 フィボナッチ数列は再帰関数の題材として適切なのか 文字列を扱うString型からstripメソッドやreplaceAllメソッドで余分な空白文字を削除できるよ。 大石ゆかり そんな便利な機能がString型にあるんですね。 田島悠介 そうなんだ。 文字列の前後の空白ならstripメソッド、文字列中のすべての空白ならreplaceAllメソッドで削除できるよ。 どちらのメソッドも全角と半角スペースの両方に対応できるんだ。 大石ゆかり そうなんですね!さっそく使い方を教えてください! 前後の空白を削除する(stripメソッド) 文字列を扱うStringクラスにあるstripメソッドで、文字列の前後にある半角スペースと全角スペースの空白文字を削除します。 ※stripメソッドは2017年から使えるようになったJava 11に含まれるメソッドです。stripメソッドが使えない場合、replaceAllメソッドかtrimメソッドを使います。replaceAllメソッドについては後半の解説記事「文字の間の空白を削除する(replaceAllメソッド)」、trimメソッドとstripメソッドの違いについては「stripメソッドとtrimメソッドの違い」の解説記事をご覧ください。 ※文字の間にある空白文字を削除する場合は、後半の解説記事にあるreplaceAllメソッドを使います。 書式 String型.strip(); stripメソッドに引数はありません。 String型で宣言した変数などからstripメソッドを呼び出します。 stripメソッドを呼び出された文字列は、文字列の前後の空白文字(半角スペースと全角スペース)が削除されます。 また、改行コードやタブコードなど空白の特殊文字も同様に削除できます。 ※特殊文字とは、キーボードから直接入力できない改行やタブなどの文字のことです。 【参考】Javaの特殊文字 改行やタブを文字列として扱えるようにしたものが特殊文字です。 Javaでは特殊文字の前に、エスケープシーケンス(\またはWindowsでは¥)をつけて特殊文字であることを表します。 改行は「\n」(または¥n)、タブは「\t」(または¥t)と表記します。 サンプルコード 前後に空白文字がある文字列から、前後の空白文字をstripメソッドで削除します。 ソースコード public フィボナッチ数列は再帰関数の題材として適切なのか class StripSample < public static void main(String[] args) < //前後に空白文字が入った文字列 String str_han_sp = " 前後に半角スペース "; String str_zen_sp = " 前後に全角スペース ";

3つの事例から学ぶ!適切なパンくずリストの使い方

本稿は、Webdesigner Depotのブログ記事を了解を得て日本語翻訳し掲載した記事になります。 本記事は、コピーライターのMarc Schenker氏によって投稿されました。 「パンくず」と聞くとグリム童話の『ヘンゼルとグレーテル』を連想する人が多いかもしれません。 物語の中で、ヘンゼルはパンくずを家に帰るときの道しるべとして道に置いていきました。 Webの世界でも同じように、サイト訪問者のためにより良いUXを創造するときに、パンくずリストがナビゲーションとして役立つようになっています。 ユーザーがWebサイト内で現在どの位置にいるかを確認したいときに、パンくずリストは頼もしい存在です。パンくずリストは、ユーザーのアクセスしたページを追跡して表示することができます。アクセスした順にページを表示する場合もあれば、別の配置方法でページを表示する場合もあります。 この記事では、適切なパンくずリストの使い方を紹介しています。 パンくずナビゲーションの主な3タイプ パンくずリストには主に3つのタイプがあり、そのうち最初の2タイプは、最後のタイプよりもよく使われているでしょう。 位置型パンくずリスト 位置型パンくずリストは、サイトの階層構造において現在どの場所にいるかをユーザーに示します。サイト内でユーザーをわかりやすく導くことができるため、広く利用されているパンくずリストです。 位置型パンくずリストは、コンテンツが複数のレベルから構成され、ナビゲーションが複数のレイヤーから構成されているサイトで特によく利用されています。 ユーザーは、現在より前の、より上位のレベルの階層にあるコンテンツに、1クリックで戻ることができます。位置型パンくずリストは静的であるため、ユーザーがサイト内での現在位置を確認するのに役立ちます。 基本的な使い方の例として、1-800 Flowersのサイトを見てみましょう。 ユーザーは「私の誕生日(It’s My Birthday)」というフラワーアレンジメントのページにアクセスすると、このサイトが、トップページ(Home)、誕生日(Birthday)の順にページを辿って、「私の誕生日」のページに辿り着くことができる構造になっていると一目でわかります。 ユーザーはこれらの上位の階層にあるページにアクセスすることもできます。 属性型パンくずリスト 属性型パンくずリストは、位置型パンくずリストとは異なり、静的ではなく、ユーザーの操作によって絶えず変化し、検索フィルタのように機能します。 サイト内での現在位置を示すことはない代わりに、ページのコンテンツのメタデータを表示します。 そのため、属性型パンくずリストはユーザーが「何を買いたいか」をフィルタでカスタマイズして検索できるような、ECサイトによく使用されています。例えば、車の販売サイトなどです。 属性型パンくずリストは、すでにアクセスしたページに戻るために役立つとは限りません。 具体的な例として、Cars.comで使われているパンくずリストを見てみましょう。ユーザーが車の「メーカー」、「モデル」の検索条件からオプションを選択して検索すると、ページ左上にあるサイトのロゴのすぐ下に、パンくずリストが現れます。 検索条件の「製造年」、「メーカー」、「モデル」からユーザーが選択したオプションが表示されますが、前のページに戻ることはできません。 このように、属性型パンくずリストは、前にアクセスしたページに戻ることができる位置型パンくずリストとは異なっているという点が重要です。 パス型パンくずリスト パス型パンくずリストは、パンくずリストの主な3つのタイプの中で最も人気のないものです。その理由は、率直に言うと、このパンくずリストはブラウザの「戻る」ボタンを再表示したものに過ぎないからです。 UXを改善する効果はなく、むしろ余分な繰り返しなのです。 履歴型のパンくずリストとも呼ばれているパス型パンくずリストは、サイトの階層構造の深いレベルにあるページにアクセスしたユーザーに対して、追加的なコンテキストや情報を与えることはできないため、役に立つとはいえません。 例として、ユーザーがすでにクリックした検索結果から商品ページにアクセスする場合などがあります。 パス型パンくずリストにはこのようなUX上の問題があるため、現在ではサイトに使われることもますます稀になっています。 パンくずリストごとに使用が適したサイトとは パンくずリストの3つのタイプは各々どのようなサイトに使用するのが適しているのでしょうか? まず最初に、パス型パンくずリストについては考える必要はないでしょう。少なくともUXを向上する効果はなく、最悪の場合にはユーザーが混乱する原因となる可能性さえあります。 というのもサイトの階層構造そのものを正確に表示するものではないからです。ここでは、他の2つについて考えます。 位置型パンくずリスト 位置型パンくずリストは、複数のレベルのコンテンツから成る、深い階層構造の大型サイトに適しています。大型サイトの例として、数多くのアイテムが販売・オークションのために出品されているeBayが挙げられます。 したがって、ユーザーにとって、サイトの階層構造がわかりやすくページを行き来するのに役立つため、位置型パンくずリストは、コンテンツの階層構造が深いサイトに最適です。 属性型パンくずリスト 次に、属性型パンくずリストに注目しましょう。 フィボナッチ数列は再帰関数の題材として適切なのか すでにCars.comのサイトの例で見たように、ユーザーに検索条件について数多くのカスタマイズ可能なオプションを提供しているeコマースのサイトには、属性型パンくずリストのようなナビゲーションが適しています。 ユーザーは、検索や注文のときに加えた数多くの変更を確認したいと思うことが多いため、位置型パンくずリストを使用するよりも、属性型パンくずリストによってフィルタを表示する方が効果的です。 [PR] Javaプログラミングで挫折しない学習方法を動画で公開中パンくずリストのベストプラクティス あなたがクライアントのサイトでパンくずリストのナビゲーションを設計するときには、これらの手法を実践すれば、間違いなく上手くいくでしょう。 パンくずリストの構造の中に、重複する要素がないかどうか確認します。ユーザーを混乱させる元となるため、1つのページが複数のカテゴリまたはコンテンツの複数のレベルに重複して分類されることのないように注意します。 パンくずリストの各リンク部分を区分するときには、記号(>) を使います。なぜなら、このスタイルが数年来の伝統であり、多くのユーザーが慣れていて使いやすいものだからです。 パンくずリストの中の各カテゴリには、検索順位に反映したいと思うキーワードを設定します。SEO対策として有効です。 パンくずリストは、正しく実装することが重要です デザインやUXの多くのコンセプトと同様に、正しく実装されていなければ、本来ユーザにとって非常に役立つ素晴らしい技法もかえって障害となります。 UXに何の効果ももたらさない、あるいはUXに悪影響を与えるようなパンくずリストではなくて、UXを最適化できるパンくずリストを設計するために正しい知識を身につけることが、このガイド記事の目的です。 パンくずリストは、様々なサイトで絶対的に必要となるわけではありません。 しかし、サイトのコンテンツが数多くのレイヤーから構成されている場合や、検索条件に数多くのオプションを設置した方が良いような場合には、パンくずリストを使用すれば、ユーザーにとって役立つナビゲーションを加えることが可能です。 フィボナッチ数列は再帰関数の題材として適切なのか パンくずリストのタイプ別の目的を理解することで、設計するサイトに合ったパンくずリストを実装できます。適切なパンくずリストを選択できれば、ユーザーの満足度を向上させ、集客の効果も高まるでしょう。 次にパンくずリストを実装するときには、これらのことを考えてみてください。 TechAcademyでは初心者でもエンジニアになれるオンラインブートキャンプを開催しています。これからプログラミングやデザインの勉強をしてみたいと思っている方は、ぜひご覧ください。 過去に独学で始めてみたけど挫折してしまった人でも、現役のエンジニアやデザイナーの元でサポートを受けながら進めることができます。その場ですぐ聞けるので、つまずくことなく習得できるはずです。 プログラミングを独学していて、このように感じた経験はないでしょうか? ・調べてもほしい情報が見つからない ・独学のスキルが実際の業務で通用するのか不安 ・目標への学習プランがわからず、迷子になりそう テックアカデミーでは、このような

Javaで再帰処理を実装する方法を現役エンジニアが解説【初心者向け】

田島悠介

大石ゆかり

田島悠介

大石ゆかり

1時間でできる無料体験!

再帰処理の書き方

実際に書いてみよう

ソースコード

「スクールは高いから独学で成功する」という気持ちの方は多いと思います。
もちろんその方が金額は低く抑えられるでしょう。
ただ 独学には向き不向きがあり、実はスクールが向いている人も大勢います。

そんな方のために参考として、 テックアカデミー卒業生がスクールを選んだ理由 をご紹介します。

  • ・困って挫折しそうなときに、質問や相談できる相手がいる環境で学んでいきたいなと思った
  • ・わかった気になっているだけだったので、自分を追い込む環境に置いた方がいいと感じた
  • ・スクールのカリキュラムで市場に求められるスキルを学ぶべきと思った

少しでも当てはまる部分があれば、 スクールが向いているかもしれません。
お試しのつもりで、まずは一度 無料相談 に参加してみませんか?

現役エンジニア・デザイナーに何でも気軽に相談できる30分 を すべて無料で できます。
無理な勧誘は一切ない ので、お気軽にご参加ください。

監修してくれたメンター

大石ゆかり

田島悠介

大石ゆかり

初心者・未経験でもできる。まずはテックアカデミーに相談しよう

  • ・調べてもほしい情報が見つからない
  • ・独学のスキルが実際の業務で通用するのか不安
  • ・目標への学習プランがわからず、迷子になりそう

テックアカデミーでは、このような 学習に不安を抱えている方へ、現役エンジニア講師とマンツーマンで相談できる機会を無料で提供 しています。
30分間、オンラインでどんなことでも質問し放題です。

「受けてよかった」と感じていただけるよう フィボナッチ数列は再帰関数の題材として適切なのか 厳しい試験を通過した講師 があなたの相談に真摯に向き合います。

「ただ気になることを相談したい」
「漠然としているがプロの話を聞いてみたい」
こんな気持ちでも大丈夫です。

無理な勧誘は一切ありません ので、まずはお気軽にご参加ください。
※体験用のカリキュラムも無料で配布いたします。(1週間限定)

記事を検索

関連するキーワード

関連する記事

JavaのforEach文を利用してListの各要素を処理する方法を現役エンジニアが解説【初心者向け】

JavaのAPIドキュメント(リファレンス)のダウンロードと使用方法を現役エンジニアが解説【初心者向け】

Javaの可変長引数の使い方を現役エンジニアが解説【初心者向け】

Javaのインナークラスの使い方を現役エンジニアが解説【初心者向け】

Javaのカプセル化について現役エンジニアが解説【初心者向け】

組み込み系システムとJavaの関係性を現役エンジニアが解説【初心者向け】

あわせてよく読まれている記事

PHPで再帰処理を実装する方法を現役エンジニアが解説【初心者向け】

今回は、PHPで再帰処理を実装する方法について、TechAcademyのメンター(現役エンジニア)が実際のコードを使用して初心者向けに解説します。 PHPについてそもそもよく分からないという方は、PHPとは何なのか解説した記事を読むとさらに理解が深まるでしょう。 なお本記事は、TechAcademyのオンラインブートキャンプPHP/Laravel講座の内容をもとに紹介しています。 田島悠介 今回は、PHPに関する内容だね! 大石ゆかり どういう内容でしょうか? 田島悠介 PHPで再帰処理を実装する方法について詳しく説明していくね! 大石ゆかり お願いします! この記事ではPHPで再起処理を実装する方法について解説します。 目次 再帰とは 再帰関数の使い方 再帰処理の例 実際に書いてみよう まとめ 再帰とは 再帰処理とは、関数がメソッドの中で自分自身を呼び出す処理のことです。 再帰処理は自分自身を呼び出すため適切な終了処理をしない限り無限ループになってしまう点に注意する必要があります。 [PR] Javaプログラミングで挫折しない学習方法を動画で公開中再帰関数の使い方 再帰関数は関数の中に自分自身を呼び出すことをいいます。ただそのままだと無限に自分自身を呼び出し続けるため終了条件が必要になります。 再帰関数は以下のように書きます。 function 関数名(引数) < if (終了条件) < return 戻り値; >else < 関数名(引数); return 戻り値; >> 自分自身を再度呼ぶ際に同じ引数を設定すると無限ループになるため引数を別の値に変えるようにする必要があります。 再帰処理の例 再帰処理の例として階乗の計算について紹介します。 階乗とは数学の計算方法の1つで4!フィボナッチ数列は再帰関数の題材として適切なのか や5!のように「数字!」と書きます。1から数字までの整数を掛け合わせた値を得ることができます。 6!だと以下のような計算になります。 6! = 1 * 2 * 3 * 4 * 5 フィボナッチ数列は再帰関数の題材として適切なのか フィボナッチ数列は再帰関数の題材として適切なのか * 6; ただこの計算はこのような理解もできます。 6! = 5! * 6; 6! = (4! * 5) * 6 6! = ((3! * 4) * 5) *

JavaScriptで再帰処理を行う方法を現役エンジニアが解説【初心者向け】

JavaScriptで再帰処理を行う方法について、TechAcademyのメンター(現役エンジニア)が実際のコードを使って初心者向けに解説します。 JavaScriptについてそもそもよく分からないという方は、JavaScriptとは何なのか解説した記事をまずご覧ください。 なお本記事は、TechAcademyのオンラインブートキャンプ、JavaScript/jQuery講座の内容をもとにしています。 田島悠介 今回は、JavaScriptに関する内容だね! 大石ゆかり どういう内容でしょうか? 田島悠介 JavaScriptで再帰処理を行う方法について詳しく説明していくね! 大石ゆかり お願いします! 再帰処理とは 再帰処理とは、ある処理について、その処理の中で自身を呼び出すような処理のことを言います。 再帰処理のサンプルと解説 再帰処理のサンプルとしてフィボナッチ数列を取り上げてみます。フィボナッチ数列から引数で指定した位置の数字を取得する関数を考えます。まず、フィボナッチ数列がどのような数列であったかと言うと、 [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, . ] JavaScriptの配列に見立てて最初の0を0番目と考えることにします。例えば、6番目の8という値は、4番目の3と5番目の5を足した数になっています。 なので、次のような式が成り立ちます。 F(0) = 0 (n = 0) F(1) = 1 (n = 1) F(n) = F(n-2) + F(n-1) (n >= 2) これを、JavaScriptの関数として記述してみます。 const フィボナッチ数列は再帰関数の題材として適切なのか フィボナッチ数列は再帰関数の題材として適切なのか f = n => n < 2 ? n : f(n-2) + f(n-1) 試しにコンソールに出力して確認しましょう。 for (let i = 0 ; i <= 10 ; i++) < console.log(f(i)) >関数fは、その処理の中で自身である関数fを呼び出しています。つまり、この関数は再帰処理をしています。 [PR]

Pythonで再帰関数を作る方法【初心者向け】

Pythonで再帰関数を作る方法について解説します。 そもそもPythonについてよく分からないという方は、Pythonとは何なのか解説した記事を読むとさらに理解が深まります。 なお本記事は、TechAcademyのオンラインブートキャンプPython講座の内容をもとに紹介しています。 田島悠介 今回は、Pythonに関する内容だね! 大石ゆかり どういう内容でしょうか? 田島悠介 再帰関数を作る方法について詳しく説明していくね! 大石ゆかり お願いします! 再帰関数とは 再帰関数とはプログラミングの手法の1つで、プログラムの中に自分自身の呼び出しが含まれているものを言います。 再帰関数は、繰り返し関数と同様に、同様な処理を複数回行う場合に利用されますが、より複雑な問題を簡単な問題に置き換えて処理できると言われています。再帰関数は以下のような場面で利用されています。 データ処理 複数のデータをソートしたり、繰り返し処理を行う場合、データ構造によっては再帰関数を使うと効率的な場合があります。 再帰データ型 複雑な問題の解決 よく例題としてあげられるのが「ハノイの塔」の問題です。一定のルールに従い、毎回状態が変わる処理に対して、再帰関数を使うと簡単な問題に置き換えて処理することができます。 ハノイの塔 構文解析(自然言語処理) 自然言語処理において、文章を単語に分解する処理を、再帰関数を用いて行う場合があります。自然言語処理については以下の記事も参考にしてください。 自然言語処理とは!仕組みやライブラリを解説 余談ですが、再帰的表現はプログラミングで古くから用いられており、コンピュータ関連の用語にもしばし登場します。例えば「Linux」は「Linux is フィボナッチ数列は再帰関数の題材として適切なのか not unix」の略語であり、自分自身がもととなる文章に含まれています。 再帰的頭字語 Pythonで再帰関数を作る方法 Python ではユーザー定義関数を利用して再帰関数を作成することができます。 def myfunc(x): if 終了条件: return x // 何かの処理を行う myfunc(x) 注意点は以下の通りです。 必ず終了条件を入れましょう。終了条件が無いと永久に再帰呼び出しを行い、処理が終わらなくなってしまいます。 再帰呼び出しを行う際の引数に注意しましょう。こちらも状態が変わらないままだと、終了条件の判定が正しく行えません プログラムの内容が複雑だと感じたら、再帰関数以外で実現出来ないか考えてみましょう。再帰関数はシンプルに記述できる反面、処理を追いづらくバグを発見しづらいという面もあります。 [PR] Javaプログラミングで挫折しない学習方法を動画で公開中実際に書いてみよう 今回のサンプルプログラムでは、1からnの整数の和を返すプログラムを、再帰関数を使った場合と使わない場合で確認します。はじめに再帰関数を使わない場合です。 def sum(n): ret = 0 for i in range(1, n + 1): ret += i return ret s = sum(100) print("1から100の合計は", s,

JavaScriptでDOMを再帰的に操作する方法を現役エンジニアが解説【初心者向け】

実際に書いてみる!Javaで階乗の計算を行う方法【初心者向け】

Javaで階乗を行う方法について解説します。 実際にプログラムを書いて説明しているので、ぜひ理解しておきましょう。 そもそもJavaについてよく分からないという方は、Javaとは何なのか解説した記事を読むとさらに理解が深まります。 なお本記事は、TechAcademyのオンラインブートキャンプJava講座の内容をもとに作成しています。 田島悠介 今回は、Javaに関する内容だね! 大石ゆかり どういう内容でしょうか? 田島悠介 階乗を行う方法について詳しく説明していくね! 大石ゆかり お願いします! 階乗計算の書き方 高校数学の学習範囲になりますが、階乗とは、1からある数までの連続する整数の積のことです。 例えば1から5までを掛け合わせた結果は5の階乗といい、 5! と書き表します。 5!は「 1 × 2 × 3 × 4 × 5 フィボナッチ数列は再帰関数の題材として適切なのか 」なので「 120 」となります。この階乗の計算をプログラムで行う場合、計算メソッドを再帰処理と呼ばれる形で作成することができます。 再帰処理のメソッドは処理中に自分自身を呼び出します。 (例) void loopMethod() < loopMethod(); >上記のloopMethod( )を実行すると、その中でloopMethod()を呼び、更にその中で・・と自分自身を呼び続けます。 ただ、この例は終了するための処理がないため、実行すると無限ループになってしまいます。 実際に再帰処理を書く際には、なんらかの終了条件を設ける必要があります。 実際に階乗計算をするメソッドを書いてみましょう。 (階乗計算する再帰処理メソッドの例) int factorial(int n) < if(n == 0)< return 1; >return n * factorial(n-1); > 上記のメソッドを3を引数に渡して実行したとします。 その場合、まず、このメソッドは 3 と factorial(2) の返す値の積を返そうとします。 次に、factorial(フィボナッチ数列は再帰関数の題材として適切なのか フィボナッチ数列は再帰関数の題材として適切なのか 2)は 2 と factorial(1) の返す値の積を、更に次に、factorial(1)は 1 と factorial(0) の返す値の積を、そして、factorial(0)がif文の中に入り、 フィボナッチ数列は再帰関数の題材として適切なのか フィボナッチ数列は再帰関数の題材として適切なのか 1 を返します。 これにより具体的には「 1 × 1 ×

Pythonで再帰的な関数を利用してフィボナッチ数列を実装する方法を現役エンジニアが解説【初心者向け】

Pythonで再帰的な関数を利用してフィボナッチ数列を実装する方法について、TechAcademyのメンター(現役エンジニア)が実際のコードを記述し、初心者向けに解説します。 Pythonについてそもそもよく分からないという方は、Pythonとは何なのか解説した記事を読むとさらに理解が深まるでしょう。 なお本記事は、TechAcademyのオンラインブートキャンプ、Python講座の内容をもとに紹介しています。 田島悠介 今回は、Pythonに関する内容だね! 大石ゆかり どういう内容でしょうか? 田島悠介 Pythonで再帰的な関数を利用してフィボナッチ数列を実装する方法について詳しく説明していくね! 大石ゆかり お願いします! フィボナッチ数列とは フィボナッチ数列とは、「1番目と2番目の数値は 1であり、3番目以降の数値は直前の2数の和である数列」のことです。 言葉ではイメージできないものの、具体的に書くと以下のような数列になります。 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233…. 例えば3番目の数値は1+1=2、4番目の数値は1+2=3のようにして算出されています。 フィボナッチ数列は、再帰的な関数を利用して作成することが可能です。 再帰とは 再帰とは、簡単に言うと「プログラム上で再度呼び出すこと」を指します。 例えば、nの階乗を計算する場合を考えてみましょう。 階乗とは自然数を階段のように掛け算する計算のことであり、5の階乗であれば5・4・3・2・1=120となります。 階乗の計算は、以下のコードのように関数を再帰的に呼び出して実行することが可能です。 #nの階乗を算出する関数 def factorial(n): if n <= 1: return 1 else: return n*factorial(n-1) コードを見ると、factorial関数の戻り値に同じ関数が用いられています。 関数の中で再度呼び出すことで、階乗の計算が表現できます。 それでは実際に具体的な数値を用いて関数をコールしてみましょう。 >>>factorial(6) 720 6・5・4・3・2・1=720なので、正しい結果が得られていることが証明できます。 また、nが1以下の時は1が戻り値となるので、factorial(1)が呼ばれた時に再帰は途絶えます。 [PR] Javaプログラミングで挫折しない学習方法を動画で公開中再帰的な関数を利用してフィボナッチ数列を実装してみよう 再帰的な関数を利用して、フィボナッチ数列を実装してみましょう。 コードは以下のようになります。 def fibonacci(n): if n <= 2:

関連記事

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次
閉じる