Jadual Kandungan
php 递归函数的三种实现方式,php递归函数三种
Rumah php教程 php手册 php 递归函数的三种实现方式,php递归函数三种

php 递归函数的三种实现方式,php递归函数三种

Jun 13, 2016 am 08:56 AM
fungsi rekursif

php 递归函数的三种实现方式,php递归函数三种

   递归函数是我们常用到的一类函数,最基本的特点是函数自身调用自身,但必须在调用自身前有条件判断,否则无限无限调用下去。实现递归函数可以采取什么方式呢?本文列出了三种基本方式。理解其原来需要一定的基础知识水品,包括对全局变量,引用,静态变量的理解,也需对他们的作用范围有所理解。递归函数也是解决无限级分类的一个很好地技巧。如果对无限级分类感兴趣,请参照php利用递归函数实现无限级分类。我习惯套用通俗的话解释复杂的道理,您确实不明白请参见手册。

  利用引用做参数

  先不管引用做不做参数,必须先明白引用到底是什么?引用不过是指两个不同名的变量指向同一块存储地址。本来每个变量有各自的存储地址,赋值删除各行其道。现在可好,两个变量共享一块存储地址。 $a=&$b; 。实际上指的是 $a 不管不顾自己原来的存储地址,非要和 $b 共享一室了。因而任何对存储地址数值的改变都会影响两个值。  

  函数之间本来也是各行其是,即便是同名函数。递归函数是考虑将引用作为参数,成为一个桥梁,形成两个函数间的数据共享。虽然两个函数见貌似操作的是不同地址,但是实际上操作的是一块儿内存地址。

  

<span>function</span> test(<span>$a</span>=0,&<span>$result</span>=<span>array</span><span>()){
</span><span>$a</span>++<span>;
</span><span>if</span> (<span>$a</span><10<span>) {
    </span><span>$result</span>[]=<span>$a</span><span>;
    test(</span><span>$a</span>,<span>$result</span><span>);
}<br />echo $a;
</span><span>return</span> <span>$result</span><span>;

}</span>
Salin selepas log masuk

  上面的例子非常简答,以$a<10作为判断条件,条件成立,则把$a赋给$result[];将$result的引用传入函数,会将每一次递归产生的$a添加到结果数组$result。因而本例生成的$result数组是 Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 [6] => 7 [7] => 8 [8] => 9 )

本例比较有意思的是echo $a 的值。相信很多人认为是12345678910吧,其实不然,是1098765432。为什么呢?因为函数还没执行echo $a前就进行了下一次的函数递归。真正执行echo $a是当$a<10条件不满足的时候,echo $a,返回$result,对于上一层而言,执行完递归函数,开始执行本层的echo $a,依次类推。

  利用全局变量

  利用全局变量完成递归函数,请确保你确实理解什么是全局变量。global在函数内申明变量不过是外部变量的同名引用。变量的作用范围仍然在本函数范围内。改变这些变量的值,外部同名变量的值自然也改变了。但一旦用了&,同名变量不再是同名引用。利用全局变量实现递归函数没必要理解到这么深的一层,还保持原有对全局变量的看法就可以顺理成章理解递归函数。

  

<span>function</span> test(<span>$a</span>=0,<span>$result</span>=<span>array</span><span>()){
    </span><span>global</span> <span>$result</span><span>;
    </span><span>$a</span>++<span>;
    </span><span>if</span> (<span>$a</span><10<span>) {
        </span><span>$result</span>[]=<span>$a</span><span>;
        test(</span><span>$a,$result</span><span>);
    }
    </span><span>return</span> <span>$result</span><span>;
}</span>
Salin selepas log masuk

  利用静态变量

  我们常常在类中见到static,今天我们把它利用到递归函数中。请记住static的作用:仅在第一次调用函数的时候对变量进行初始化,并且保留变量值

  举个栗子:

<span>function</span><span> test(){
</span><span>static</span> <span>$count</span>=0<span>;
</span><span>echo</span> <span>$count</span><span>;

</span><span>$count</span>++<span>;
}
test();
test();
test();
test();
test();</span>
Salin selepas log masuk

  请问这一段代码的执行结果是多少?是00000么?必然不是。是01234。首先第一次调用test(),static对 $count 进行初始化,其后每一次执行完都会保留 $count 的值,不再进行初始化,相当于直接忽略了 static $count=0; 这一句。

  因而将static应用到递归函数作用可想而知。在将需要作为递归函数间作为“桥梁"的变量利用static进行初始化,每一次递归都会保留"桥梁变量"的值。

<span>function</span> test(<span>$a</span>=0<span>){
    </span><span>static</span> <span>$result</span>=<span>array</span><span>();
    </span><span>$a</span>++<span>;
    </span><span>if</span> (<span>$a</span><10<span>) {
        </span><span>$result</span>[]=<span>$a</span><span>;
        test(</span><span>$a</span><span>);
    }
    </span><span>return</span> <span>$result</span><span>;
}</span>
Salin selepas log masuk

  

  总结

  所谓递归函数,重点是如何处理函数调用自身是如何保证所需要的结果得以在函数间合理"传递",当然也有不需要函数之间传值得递归函数,例如:

<span>function</span> test(<span>$a</span>=0<span>){
    </span><span>$a</span>++<span>;
    </span><span>if</span> (<span>$a</span><10<span>) {
        </span><span>echo</span> <span>$a</span><span>;

        test(</span><span>$a</span><span>);
    }
}</span>
Salin selepas log masuk

  面对这样的函数,我们就不必大伤脑筋了。顺便说一句,深入理解变量引用相关知识对解决这类问题大有裨益。

 

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Apakah teknik pengoptimuman untuk fungsi rekursif C++? Apakah teknik pengoptimuman untuk fungsi rekursif C++? Apr 17, 2024 pm 12:24 PM

Untuk mengoptimumkan prestasi fungsi rekursif, anda boleh menggunakan teknik berikut: Gunakan rekursif ekor: Buat panggilan rekursif pada penghujung fungsi untuk mengelakkan overhed rekursif. Memoisasi: Simpan hasil pengiraan untuk mengelakkan pengiraan berulang. Kaedah bahagi dan takluk: menguraikan masalah dan menyelesaikan sub-masalah secara rekursif untuk meningkatkan kecekapan.

Bagaimana untuk menyelesaikan ralat bersarang fungsi yang berlebihan dalam kod Python? Bagaimana untuk menyelesaikan ralat bersarang fungsi yang berlebihan dalam kod Python? Jun 25, 2023 pm 12:35 PM

Python ialah bahasa pengaturcaraan yang sangat berkuasa, dan ramai pengaturcara memilih Python sebagai bahasa pengaturcaraan utama mereka. Walau bagaimanapun, terlalu banyak fungsi bersarang dalam kod boleh menyebabkan atur cara sukar untuk dikekalkan dan difahami. Artikel ini akan meneroka cara menyelesaikan ralat bersarang fungsi yang berlebihan dalam kod Python. Pengenalan ringkas kepada sarang fungsi Sarang fungsi merujuk kepada proses mentakrifkan fungsi lain dalam badan sesuatu fungsi. Fungsi bersarang boleh menjadikan struktur program lebih jelas dan kod lebih mudah dibaca dan diselenggara. Walau bagaimanapun, terlalu banyak fungsi bersarang boleh membawa kepada struktur kod yang terlalu kompleks.

Penggunaan fungsi rekursif C++ dalam algoritma carian? Penggunaan fungsi rekursif C++ dalam algoritma carian? Apr 17, 2024 pm 04:30 PM

Fungsi rekursif digunakan dalam algoritma carian untuk meneroka struktur data seperti pokok. Carian pertama mendalam menggunakan timbunan untuk meneroka nod, manakala carian pertama keluasan menggunakan baris gilir untuk melintasi lapisan demi lapisan. Dalam aplikasi praktikal, seperti mencari fail, fungsi rekursif boleh digunakan untuk mencari fail tertentu dalam direktori tertentu.

Apakah syarat keluar untuk fungsi rekursif dalam C++? Apakah syarat keluar untuk fungsi rekursif dalam C++? Apr 17, 2024 am 11:33 AM

Syarat keluar dari fungsi rekursif C++ termasuk: Syarat garis dasar: Semak sama ada fungsi mencapai keadaan yang boleh mengembalikan hasil secara langsung, biasanya menilai sama ada keadaan atau nilai parameter tertentu memenuhi ambang. Syarat penamatan rekursif: Alternatif kepada atau sebagai tambahan kepada syarat garis dasar, memastikan fungsi berhenti selepas beberapa panggilan rekursif tertentu, dengan menjejak kedalaman rekursif atau menetapkan had kedalaman rekursif maksimum.

Penggunaan fungsi rekursif C++ dalam algoritma pengisihan? Penggunaan fungsi rekursif C++ dalam algoritma pengisihan? Apr 17, 2024 am 11:06 AM

Aplikasi fungsi rekursif dalam algoritma pengisihan dalam C++ Algoritma isihan sisipan dan gabungan yang dilaksanakan oleh fungsi rekursif boleh menguraikan masalah kompleks kepada sub-masalah yang lebih kecil dan menyelesaikannya dengan cekap melalui panggilan rekursif. Isih sisipan: Mengisih tatasusunan dengan memasukkan elemen satu demi satu. Cantumkan isihan: Bahagi dan takluk, bahagikan tatasusunan dan susun sub-tatasusunan secara rekursif, dan akhirnya gabungkan sub-tatasusunan yang diisih.

Bagaimana untuk melaksanakan strategi pengoptimuman rekursi ekor bagi fungsi rekursif C++? Bagaimana untuk melaksanakan strategi pengoptimuman rekursi ekor bagi fungsi rekursif C++? Apr 17, 2024 pm 02:42 PM

Strategi pengoptimuman rekursif ekor secara berkesan mengurangkan kedalaman tindanan panggilan fungsi dan menghalang limpahan tindanan dengan menukarkan panggilan rekursif ekor kepada gelung. Strategi pengoptimuman termasuk: Kesan rekursif ekor: Semak sama ada terdapat panggilan rekursif ekor dalam fungsi. Tukar fungsi kepada gelung: Gunakan gelung dan bukannya panggilan rekursif ekor dan kekalkan tindanan untuk menyimpan keadaan perantaraan.

Bagaimana untuk melaksanakan faktorial menggunakan fungsi rekursif dalam bahasa Go? Bagaimana untuk melaksanakan faktorial menggunakan fungsi rekursif dalam bahasa Go? Jul 31, 2023 pm 08:31 PM

Bagaimana untuk melaksanakan faktorial menggunakan fungsi rekursif dalam bahasa Go? Faktorial ialah pengiraan biasa dalam matematik yang mendarabkan integer bukan negatif n dengan semua integer positif yang lebih kecil daripadanya, sehingga 1. Sebagai contoh, faktorial bagi 5 boleh dinyatakan sebagai 5!, dikira sebagai 54321=120. Dalam pengaturcaraan komputer, kita sering menggunakan fungsi rekursif untuk melaksanakan pengiraan faktorial. Pertama, kita perlu memahami konsep fungsi rekursif. Fungsi rekursif merujuk kepada proses memanggil fungsi itu sendiri dalam definisi fungsi. Apabila menyelesaikan masalah, fungsi rekursif akan berterusan

Program C untuk menyenaraikan semua fail dan subdirektori dalam direktori Program C untuk menyenaraikan semua fail dan subdirektori dalam direktori Aug 25, 2023 pm 10:09 PM

Di sini kami mempunyai direktori. Tugas kami adalah untuk mencipta program C untuk menyenaraikan semua fail dan subdirektori dalam direktori. Direktori ialah tempat/kawasan/lokasi di mana satu set fail akan disimpan. Subdirektori ialah direktori dalam direktori akar, yang, seterusnya, boleh mempunyai subdirektori lain. Dalam bahasa pengaturcaraan C anda boleh menyenaraikan semua fail dan subdirektori dengan mudah dalam direktori. Program berikut menunjukkan cara menyenaraikan semua fail dan subdirektori dalam direktori. //Contoh program C untuk menyenaraikan semua fail dan subdirektori dalam direktori Demonstrasi langsung #include<stdio.h>#include<dirent.h>intmain(void){ &am

See all articles