function rec_func($x) {
echo $x;
if ($x < 1000) {
$x++;
rec_func(&$x);
}
}
è¿™ä¸æ˜¯å®žé™…的递归函数,我将用于我的PHP脚本。就åƒè¿™ä¸ªä¾‹åä¸€æ ·ï¼Œæˆ‘çš„çœŸå®žå‡½æ•°å®Œå…¨æ£å¸¸ï¼Œç›´åˆ°æˆ‘开始检查它使用了多少内å˜ã€‚
如果我循环这个功能,比如100次,没有什么ä¸å¥½çš„事情å‘生。æ¯æ¬¡è¿ä»£ä¸ä½¿ç”¨çš„内å˜ä¿æŒä¸å˜ã€‚但是,如果我循环1000次以上,那么æ¤åŠŸèƒ½å°†å¼€å§‹æ¶ˆè€—比以å‰æ›´å¤šçš„内å˜ï¼Œç›´åˆ°æœ€åŽä¸€æ¬¡è¿ä»£ã€‚
峰值的数é‡ä¼¼ä¹Žå–决于我给它的å˜é‡æœ‰å¤šå¤§ï¼Œä»¥åŠå®ƒç»åŽ†äº†å¤šå°‘次è¿ä»£ï¼Œä½†æˆ‘æ— æ³•ç¡®å®šã€‚è¿™å°±æ˜¯é—®é¢˜çš„å¼€å§‹ã€‚æ¤åŠŸèƒ½å°†åœ¨1000次内开始消耗更多内å˜ã€‚然而,我的函数在1000次è¿ä»£ä¸æ¯150次左å³æ‰§è¡Œä¸€æ¬¡ï¼Œæœ€ç³Ÿç³•çš„是MY函数å¯èƒ½éœ€è¦å¾ªçŽ¯æ¬¡æ•°ç”šè‡³æ›´å¤šæ¬¡ã€‚
è¿™è®©æˆ‘å¾ˆå¥½å¥‡ï¼Œå› ä¸ºæ˜¾è€Œæ˜“è§çš„äº‹æƒ…æ˜¯ä½¿ç”¨ä¼ ç»Ÿçš„å¾ªçŽ¯ï¼ˆæˆ‘å·²ç»å®Œæˆï¼‰ï¼Œä½†æˆ‘真的想è¦ç†è§£ä¸ºä»€ä¹ˆä¼šå‘生这ç§æƒ…况,以åŠæ˜¯å¦å¯ä»¥é¿å…。
P.S。请注æ„,我仅在第一次è¿ä»£ä¸ä½¿ç”¨å®žå˜é‡ï¼Œå¹¶ä¸”å…¶åŽçš„所有è¿ä»£éƒ½ä½¿ç”¨å¼•ç”¨ï¼Œä»¥ä¿ç•™å†…å˜ã€‚æå‰è°¢è°¢ã€‚
ç”案 0 :(得分:0)
ï¼ˆå¦‚æžœæˆ‘é”™äº†ï¼Œè¯·çº æ£æˆ‘)。 æˆ‘è®¤ä¸ºï¼Œå®ƒä¸Žä½ çš„PHP模å—内å˜å¤„ç†æœ‰å…³ï¼šå®ƒåœ¨å¼€å§‹è¿è¡Œæ—¶ä¼šä¿ç•™ä¸€äº›å†…å˜ï¼ˆä¾‹å¦‚,如果它用作CGIï¼Œæˆ–è€…ä½ ä»Žå‘½ä»¤æ示符调用它)。
æ¯æ¬¡å¼€å§‹é€’归时,基本上都会åšä¸¤ä»¶äº‹ï¼š
在调用下一级递归之å‰ï¼Œå°†å½“å‰çŠ¶æ€ä¿å˜åˆ°è°ƒç”¨å †æ ˆã€‚如果您没有使用引用进行æ“作,那么也å¯ä»¥ä½¿ç”¨å½“å‰å †æ ˆçŠ¶æ€æ“作å˜é‡æ•°æ®ã€‚åªè¦ä¿ç•™çš„内å˜è¶³å¤Ÿï¼Œæ‚¨çš„内å˜æ¶ˆè€—å°±ä¸ä¼šå¢žåŠ ,但是当内å˜ä¸è¶³æ—¶ï¼Œå°†ä¿ç•™ä¸€å †æ–°çš„内å˜ï¼Œå¦‚果需è¦æ›´å¤šå†…å˜ã€‚ 它æ„味ç€ä»¥ä¸‹å†…容:
function rec_func($x) {
echo $x;
if ($x < 1000) {
$x++;
rec_func($x);
}
}
这会有更大的内å˜ä½¿ç”¨é‡ï¼Œå› 为æ¯æ¬¡é€’å½’å‘ç”Ÿæ—¶ï¼Œå †æ ˆä¸éƒ½ä¼šæœ‰ä¸€ä¸ªé¢å¤–çš„è¡Œï¼Œä½ å°†åœ¨å†…å˜ä¸åˆ›å»ºä¸€ä¸ªé¢å¤–çš„$ xæ¥å˜å‚¨å®ƒçš„当å‰çŠ¶æ€ï¼Œä»¥ä¾¿ä¿ç•™é€’归返回当å‰å †æ ˆè°ƒç”¨æ—¶çš„值。
ä»¥ä¸‹å‡ è¡Œå°†æ¶ˆé™¤å†…å˜ä½¿ç”¨é—®é¢˜ - 它使用å˜é‡å¼•ç”¨è¿›è¡Œæ“作(在这ç§æƒ…å†µä¸‹æ˜¾ç„¶ä¼šç ´å功能:
function rec_func(&$x) {
echo $x;
if ($x < 1000) {
$x++;
rec_func($x);
}
}
(由于呼å«æ—¶å‚è€ƒä¼ é€’ï¼Œæ‚¨çš„åŽŸå§‹ä»£ç 会导致致命错误。)
å¦‚æžœä½ æƒ³å‡å°‘内å˜ä½¿ç”¨é‡ï¼Œä½ 应该(或者å¯ä»¥ï¼‰åœ¨å‡½æ•°å£°æ˜Žä¸ä½¿ç”¨å¼•ç”¨ï¼Œè¿™äº›å¼•ç”¨åœ¨é€’归期间ä¸ä¼šæ”¹å˜ï¼Œä½†æ˜¯æ°¸è¿œä¸ä¼šå¯¹å˜é‡è¿›è¡Œæ”¹å˜ï¼ŒåŒæ—¶æ”¹å˜ã€‚
ä½ å¯ä»¥é€šè¿‡çŽ©debug_zval_dump()æ¥å°è¯•è‡ªå·±ï¼Œå°±åƒè¿™æ ·ï¼š
<?php
function rec_func_ref(&$x) {
//echo $x;
if ($x < 100000) {
$x++;
rec_func_ref($x);
}
echo 'rec_func_ref:'.$x.'------<br />';
debug_zval_dump($x);
echo "<br />";
}
function rec_func_not_ref($x) {
//echo $x;
if ($x < 100000) {
$x++;
rec_func_not_ref($x);
}
echo 'rec_func_not_ref:'.$x.'------<br />';
debug_zval_dump($x);
echo "<br />";
}
$a = 1;
rec_func_ref($a);
$a = 1;
rec_func_not_ref($a);
?>