ホームページ > バックエンド開発 > PHPチュートリアル > 再帰はループを隠しますか?

再帰はループを隠しますか?

WBOY
リリース: 2016-06-23 13:33:07
オリジナル
922 人が閲覧しました

まずはコードを見てみましょう

function reverse($str){  if(strlen($str)>0){    reverse(substr($str,1));    echo substr($str,0,1);    return;  }}reverse("abcdefg");//gfedcbc
ログイン後にコピー

上記の例では、実際のパラメータ abcdefg を入力した後、リバース関数はまずそれが 0 に等しいかどうかを計算します。0 に等しい場合は、ループを意味すると思います。 、それが大きい場合は、開始してください。桁数が 0 より大きいので、最初に何を入力すればよいでしょうか。これはまだ混乱しています。論理的に信じられないことです


ディスカッション(解決策)への返信

再帰はループの一種です
再帰コードはループコードに変えることができます
再帰コードとループコードの違いは次のとおりです:
再帰はシステムのスタックを使用します中間結果を保存するため
ループは、中間結果を保存するために自己管理型のデータ構造を使用します

つまり、再帰 コードはループ コードよりもはるかに単純です
再帰は効率が悪いと言う人もいますが、彼らは無知です

しかし、すべてのループがそうであるわけではありません再帰で実装できます

戻り値を持たない関数とは何ですか?
静的を試してみる

再帰はループの一種です
再帰コードはループ コードに変えることができます
再帰コードとループ コードの違いは次のとおりです:
再帰はシステムのスタックを使用して中間結果を保存します
ループは自己管理スタックを使用しますデータ構造は中間結果を保存します

したがって、再帰コードはループ コードよりもはるかに簡単です
再帰は非効率だと言う人もいますが、彼らは無知です

しかし、すべてのループが再帰で実装できるわけではありません



あなたが言っていることは Theory です。それでは遊んでみましょう:

この例についての私の理解は次のとおりです: 私がどこで誤解したかわかりますか? ! ! ! ! !

まず、パラメータ abcdefg は 7 桁なので、プログラムはそれが 0 より大きいと判断すると、計算のために直接 echo substr(abcdefg0,1); を入力します。プログラムが終了します

再帰はループです
再帰コードはループコードに変えることができます
再帰コードとループコードの違いは次のとおりです:
再帰はシステムのスタックを使用して中間結果を保存します
ループは自己管理のデータ構造を使用して保存します中間結果

それで、再帰 コードはループコードよりもはるかに単純です
再帰は非効率だと言う人もいますが、それは彼らが無知だからです

しかし、すべてのループが再帰で実装できるわけではありません


2 階も何ですか聞きたいのですが、一緒に詳しくお話しましょう。
この関数の鍵は return; だと思います
しかし、ここで誰が返すのかという疑問が生じます: reverse(substr($str,1)) なのか、それとも echo substr($str,0 ,1); なのかということです。前者だと思います。たとえば、bcdefg が返されると、プログラムがループしなくなるのはなぜでしょうか。
エコーするとき、最初に出てくるのは、どのようにして後ろから出てくるのかということです。
実際、多くの関数には暗黙の再割り当てルールがあります。例えば、 substr($ str,0,1);

実際、この時点では、計算後に $str が元の abcdefg から bcdefg に再割り当てされることが隠されています

これは、多くの初心者が解決できない場合もあります。彼らはインスピレーションを通じて突然それを理解します。ただし、ここではループやループについて説明するチュートリアルがほとんどありません。実際、プログラミングを学ぶには、その内容をよく理解する必要があるということを理解していないと思います。ヒープ、スタック、変数の原則は、多くの隠れたルールを理解するための基礎となります。

コンピューター技術を学ぶには、実践が第一条件です
機能を変更します

function reverse($str){  echo "传入 $str\n"; //这里  if(strlen($str)>0){    reverse(substr($str,1));    echo "\n返回时 $str\n";; //这里    echo substr($str,0,1);    return;  }}reverse("abcdefg");//gfedcbc
ログイン後にコピー
ログイン後にコピー
传入 abcdefg传入 bcdefg传入 cdefg传入 defg传入 efg传入 fg传入 g传入 返回时 gg返回时 fgf返回时 efge返回时 defgd返回时 cdefgc返回时 bcdefgb返回时 abcdefga
ログイン後にコピー
ログイン後にコピー

一目瞭然!

これは一昼夜考えても理解できないことです


上記のループはこんな感じです
実際のパラメータを代入した後、0より大きいのでreverse(substr($str,1));
次に、 return はそれを逆に返します (substr($str,1));

同時に、出力 echo substr($str,0,1);




コンピューター技術を学ぶための最初の条件です。
機能を変更します

function reverse($str){  echo "传入 $str\n"; //这里  if(strlen($str)>0){    reverse(substr($str,1));    echo "\n返回时 $str\n";; //这里    echo substr($str,0,1);    return;  }}reverse("abcdefg");//gfedcbc
ログイン後にコピー
ログイン後にコピー
传入 abcdefg传入 bcdefg传入 cdefg传入 defg传入 efg传入 fg传入 g传入 返回时 gg返回时 fgf返回时 efge返回时 defgd返回时 cdefgc返回时 bcdefgb返回时 abcdefga
ログイン後にコピー
ログイン後にコピー

一目瞭然!
これは何日も夜も考えても理解できないことです



さて、突然気づきました!

実際、これは次のようになります。
まず、文字列を返すステップと、文字列を出力するステップの 2 つのステップに分かれています
最初のステップ: reverse(substr($str,1) ); abcde を例として挙げます。最初のステップ abcde が関数 reverse(substr($str,1)); に代入されたら、それは bcde である必要があり、return によってメモリに返されます。 reverse 関数は新しい変数値、つまり bcde の後を引き継ぎ、 reverse(substr($str,1)) を使用して計算し、cde などを取得します。

同時に、2番目のステップのエコーも同期的に出力されるので、これは再帰の使用です
これほど詳細な方法で再帰を分析するネットワーク全体の唯一の例ではないでしょうか

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート