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

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

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

再帰

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

5回答

5960閲覧

PHPでの1~指定数までの足し算 【再帰処理】繰り返し処理は含まない

pinsong

総合スコア26

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

再帰

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2016/10/26 09:09

編集2016/10/26 10:00

###topic

内容としては、1〜指定の数字まで足し続け、結果を表示するというプログラムです。

###発生している問題
再帰処理で行いたいが、
if($arg == ?) return (?)
else return (?)
がどこから関数を引っ張ってくるのか全くわからない。

###該当のソースコード

<html lang="ja"> <head> <meta charset="UTF-8"> <title>関数の練習</title> </head> <body> <form method="POST" action="ex13.php"> 1から指定された値までの和を計算します<br> 数値を入力:<input type="number" name="n"><br> <input type="submit" value="和を計算"> </form> <?php if(isset($_POST["n"])){ } function sample($arg){ if($arg == 1) return(n); else return(arg); } ?> </body> </html>

###試したこと
試したというより考え方としては、arg(n) = arg(n - 1) + nが一般式になるとは思うが、どこにどうこの式を組み込めばいいのか分からない。

###補足情報(言語/FW/ツール等のバージョンなど)
言語 PHP HTML
IDE Visualstudio2015 php tools for visual studio

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

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

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

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

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

kei344

2016/10/26 09:24

コードはコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。
guest

回答5

0

参加します「再帰」の部分だけですが。

php

1function sample($arg){ 2 if($arg <= 1) return $arg; 3 return ( $arg + sample($arg-1) ); 4} 5 6$arg=100; 7$ttl=sample($arg);

「再帰を使って1から指定値までを足し込む」の解説

■概要 処理のイメージとしては10段の階段の最上段に居るとします。 数字を記入した紙を一段づつ降りながら10,9,8,・・・と書き各階段に置きながら降ります。 1段目に来た時 1と書いた紙が置かれます、1段目が来たら戻れとなっているので、 今度は逆に紙を拾いつつ上ります。その際に置いて有る紙で足し算しながら登ります。 9段目では、紙に書かれた数の合計が45になっています。最後に10段目 で10を足して55となります。 ■処理の作成 ・まず階段を降りるロジックを作成します。 function sample($arg){ sample($arg); } これでは無限に呼び出しを行います(コアダンプする)、リカーシブルなので 自分のコピーを呼び出すイメージです。パラメータを添えて ・sample呼ぶ際(下る)にパラメータ$argにマイナス1して渡します。 function sample($arg){ sample($arg - 1); } ・これでもまだ無限に下りますので戻りを決めます。(再帰)  受け取ったargは、呼ばれる毎に1づつ減っています。  argが1になる時を見つけて戻る事にします。 function sample($arg){ if ($arg <= 1) return; sample($arg - 1); } ($arg <= 1 としたのは最初から1以下の数字で呼ばれた場合にループしない為) これを初期値10として実行すると、リカーシブルにて10個のモジュールがメモリ上に作成されます。 各モジュールにはarg(数字)が置かれています。数字を置いた階段の出来上がりです。 1で戻る事にしましたので、arg=1である最後のモジュールから一個づつ戻ります。 戻った場所(上記)がモジュールの最終行なのでさらにその上その上と戻り最初のモジュールに 戻って終了。リカーシブルの場合、下からどのステップ(位置)に戻るかを意識して作成します。 ・足し算するロジックを加えます。 まずargが1の時の戻り値を1とします。argが1になったモジュールが1を返します。1回だけです。 当然sampleの呼び出しはしません。 戻り先の上位のモジュール達はsampleの場所で待っています。ifを通り過ぎてsample呼び出しを行った場所で待ちの状態です。 function sample($arg){ if ($arg <= 1) return(1); sample($arg - 1); } ・上のモジュールに足し算した結果を渡す為にreturnを使います。 function sample($arg){ if ($arg <= 1) return 1; return ( sample($arg - 1) ); } これだと最終結果は1となってしまいますので自分の持っている番号$argを足してから上位に戻ります。 function sample($arg){ if ($arg <= 1) return 1; return ($arg + sample($arg - 1)); } 戻りは、こんな感じで戻ります。 1 return 1; 2 + 1 = 3 retrun ($arg + sample($arg - 1)); 3 + 3 = 6 以下同様... 4 + 6 = 10 5 + 10 = 15 6 + 15 = 21 7 + 21 = 28 8 + 28 = 36 9 + 36 = 45 10 + 45 = 55

投稿2016/10/26 09:52

編集2016/10/26 14:37
A.Ichi

総合スコア4070

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

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

0

ベストアンサー

まず”料理”として考えてみる。
材料がいる。
その料理(仕様)と材料(パラメーター)そして調理器具(PHP)。
仕様では再帰的でありパラメーターは最終値。
では再帰的に考えると自分自身で自分を呼ぶ関数。

コード function sample($arg) { if( $arg > 1 ) return sample($arg-1)+$arg else return 1 } つまり自分自身を呼んで足す必要がなくなるまで呼び続ける。 でどうですか?

投稿2016/10/26 09:42

MasahikoHirata

総合スコア3747

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

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

kei344

2016/10/26 09:46

コードブロックの末尾の「```」(バッククオート3つ)が抜けてますよ?
kei344

2016/10/26 09:56

回答文でもコードブロックは使えます。あなたの回答にてその機能が正しく設定されていないので、それについての指摘です。質問者への指摘は既に行い、修正いただいております。
pinsong

2016/10/26 10:55

else以下説明していただいてもいいでしょうか。 何故return 1なのかわかりません。
MasahikoHirata

2016/10/26 11:03

最終値からー1した数値までの合計を再帰呼び出しで求めていますが、どんどんー1していくと最終値は1ですね。
pinsong

2016/10/26 11:05

なるほど、あ、elseだから上の式の間反対のことやって最終的に行きつくところが1だからreturn (1)って解釈で大丈夫ですか?
MasahikoHirata

2016/10/26 11:20

そうですよ。 挙動(動作)を紙に書いて理解してみて。 例えばargが5ならば、5に4までの合計、そして4までの合計は4に3までの合計。これを繰り返すと終わりは1。
guest

0

これは再帰処理の課題なのでしょうか?
普通に考えればループで処理するでしょうし
1からnまでの和は n*(n+1) /2ですけど、その手のロジックはしようしないということでしょうか?

再起呼び出し

とりあえずUIのところはおいておくとして、こんな感じです

PHP

1$n=10; 2print mycalc($n); 3function mycalc($n){ 4 if($n<=1){ 5 return 1; 6 } 7 return $n+mycalc($n-1); 8}

投稿2016/10/26 09:38

編集2016/10/26 09:57
yambejp

総合スコア114585

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

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

pinsong

2016/10/26 09:43

はい。おっしゃる通り、ループで解決できるのですがあえての再帰処理です。
pinsong

2016/10/26 09:44

説明が足らず、すいません
yambejp

2016/10/26 10:02

再帰処理について追記しておきましたが、オーバーフローする可能性もあるので 極端に深い処理はしないほうがよいようです
guest

0

PHP

1function sample($arg){ 2 $ret = 0; 3 if($arg>0) 4 { 5 $ret = $arg + sample($arg-1); 6 7 } 8 return $ret; 9} 10 11if(isset($_POST["n"])){ 12 $n = $_POST["n"]; 13 $sum = sample($n); 14}

でいけると思いますが、まずは再起じゃなくてfor文でやるでしょうね。。。また自分なら画面遷移の発生しないphpではなくjavascriptでやるかもしれないです。

投稿2016/10/26 10:02

hiim

総合スコア1689

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

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

0

php

1<?php 2 3if(isset($_POST["n"])){ 4 $n = $_POST["n"]; 5 $num = sample($n); 6} 7 8function sample($arg){ 9 $res =0; 10 for($i=1; $i<=$arg; $i++){ 11 $res = $res + $i; 12 } 13 return $res; 14} 15 16?> 17<!DOCTYPE html> 18<html lang="ja"> 19<head> 20<meta charset="UTF-8"> 21<title>関数の練習</title> 22</head> 23 24<body> 25<form method="POST"> 261から指定された値までの和を計算します<br> 27数値を入力:<input type="number" name="n" value="<?php echo $n; ?>"><br> 28<input type="submit" value="和を計算"> 29</form> 30答え:<?php echo $num; ?> 31</body> 32</html>

こういう事ですか?


すみません、ループ処理ではなかったのですね。
見間違いました。申し訳ありません。

投稿2016/10/26 09:49

編集2016/10/26 09:58
takepieee

総合スコア686

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問