下記のような問題があります。
どのような求め方をされますか?
【問題】
1番目は1、2番目は1、3番目は2、4番目は3、5番目は5、...と続く数列があります。
50番目の値を表示するプリグラムを作成してください
【ヒント】
1番目の要素と2番目の要素が1で、3番目以降の要素は以下で決まる。
N(n) = N(n-1) + N(n-2)
※phpで回答してください❤️
※回答時間も教えてください❤️
以上、宜しくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
さらに奇をてらった書き方をすると、配列も使わず、再帰関数も使わず、変数のスワップもせず、3つのスカラーな変数だけ($_0
$_1
$i
)で解けます。
lang
1<?php 2$_0 = 0; 3$_1 = 1; 4 5for ($i=1; $i<50; $i++) { 6 ${"_".($i&1)} = $_0 + $_1; 7} 8 9var_dump($_0 + $_1); // int(12586269025)
所要時間は 15 分ぐらい(9割ぐらい変数展開の試行錯誤(^_^;))
さらにもっと奇をてらってみました。
lang
1<?php 2function main() 3{ 4 ${0} = 0; 5 ${1} = 1; 6 7 for ($i=1; $i<50; $i++) { 8 ${$i&1} = ${0} + ${1}; 9 } 10 11 var_dump(${0} + ${1}); // int(12586269025) 12 13 // このスコープには下記の3つの変数しか存在しない 14 print_r(get_defined_vars()); 15 /* 16 Array 17 ( 18 [0] => 4807526976 19 [1] => 7778742049 20 [i] => 50 21 ) 22 */ 23} 24 25// 関数にしているのはスコープの中の変数の一覧を得るためです 26// 関数じゃなくても動作します 27main();
やっていることは↑と同じですが、変数名を普通ではありえない数字だけの名前にすることで変数展開をシンプルにしました。
なお、この回答のような記法は実際に書かれるとブチ切れ必死なので使うべきではありません。
投稿2015/07/15 01:07
編集2015/07/15 01:30総合スコア4514
0
フィボナッチ数列ですね。
for文を使うタイプは皆さんが答えてるので、奇をてらって再帰処理でいこうと思います。
lang
1$fibonacciFunc = function($num1, $num2, $num3) use (&$fibonacciFunc) { 2 if ($num3 <= 2) return $num1; 3 return $fibonacciFunc($num1 + $num2, $num1, $num3 - 1); 4}; 5echo $fibonacciFunc(1, 1, 50);
時間は約12分くらいです。
投稿2015/07/14 18:58
総合スコア1156
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
「PHPで」とは数学的アプローチは無しでということでしょうか?
公式利用可なら次の通り
ど忘れしててwikipediaで確認しました。それも含めて15分程度です。
<?php $n=50; $f=(1+sqrt(5))/2; echo floor(pow($f,$n)/sqrt(5)+0.5); //for ($n=3; $n<=50; $n++)echo $n . ": " . floor(pow($f,$n)/sqrt(5)+0.5) . "<br/>"; ?>
投稿2015/07/15 08:04
編集2015/07/15 08:15総合スコア2068
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
lang
1$n = []; 2$n[0] = 0; 3$n[1] = 1; 4for ($i = 2; $i < 51; $i++) { 5 $n[$i] = $n[$i - 1] + $n[$i - 2]; 6} 7var_dump($n[50]);
6分でした。
投稿2015/07/14 18:19
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
二つ考えました。二つ目の方がやっていることはわかりやすいと思いますが、無駄に値の入った配列ができてしまうので一つ目も考えました。回答時間はひとつ7分ぐらいです。
$first = 1;
$second = 1;
$next = 1;
//$firstは二つ前の数字、$secondはひとつ前の数字が入るようにする。
for ($i = 1; $i < 49; $i++) {
$first = $second;
$second = $next;
$next = $first + $second;
}
echo $next;
$fibonacci = array();
$fibonacci[0] = 1;
$fibonacci[1] = 1;
for ($i = 2; $i < 50; $i++) {
$fibonacci[$i] = $fibonacci[$i-1] + $fibonacci[$i-2];
}
echo $fibonacci[49];
投稿2015/07/14 18:09
総合スコア155
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。