递递递递递归归归归归
<?php
/****
燕十八 公益PHP讲堂
论 坛: http://www.zixue.it
微 博: http://weibo.com/Yshiba
YY频道: 88354001
****/
/***
====笔记部分====
关于日志log class的答疑
昨天发现的一个现象:
我们循环5000次,写入curr.log文件,
事实上呢,大约3000次的,已经超过1M了,
但是,还是持续的写入到curr.log里.
必须下次刷新,才会备份,重新建一个curr.log
PHP.exe开启进程 PID 111 start
5000次读取
php.exe结束进程 PID 111 end;
PHP.exe开启进程 PID 112 start
5000次读取
php.exe结束进程 PID 112 end
PHP.exe开启进程
5000次读取
php.exe结束进程
在1次进程中, filesize的结果会被缓存(很多文件信息获取函数的结果都会被缓存,如filemtime)
因此第1次运行时,读到的size全是0(即使这个过程中文件的内容已经被修改了)
当我们再次刷新时: filesize > 1M,
curr.log --raname--> 11202345.bak
新建curr.log filesize-->0 KB
在论坛上的问题出现在哪儿呢?
答:即便curr.log->rename->11202345.bak了,
但,filesize还是缓存了,
因此,循环的5000次中,始终认为curr.log>1M,
始终备份.....
***/
for($file='./a.txt',$i=0;$i<100;$i++) {
echo filesize($file),'<br />';
$fh = fopen($file,'ab');
fwrite($fh,$i."\r\n");
fclose($fh);
}
echo 'OK';
<?php
/****
燕十八 公益PHP讲堂
论 坛: http://www.zixue.it
微 博: http://weibo.com/Yshiba
YY频道: 88354001
****/
/***
====笔记部分====
递归
1: 不求理解,先会写
2: 再去理解
***/
/*
题目:
写一个sum($n)
求1->N的和
*/
/*
function sum($n) {
for($sum=0,$i=1;$i<=$n;$i++) {
$sum += $i;
}
return $sum;
}
echo sum(100),'<br />';
*/
/*
function sum($n) {
return array_sum((range(1,$n)));
}
echo sum(100),'<br />';
*/
/***
老师让我计算1到100的和,我不会.
但是我偏我会. [无赖法写递归函数]
问: sum(100) == ?
答: sum(99) + 100;
问: sum(99) == ?
答: sum(98) + 99;
....
....
问: sum(2) == ?
答: sum(1) + 2;
问:sum(1) == ?
答: 真会,!
sum(100)->
sum(99) + 100
sum(98) + 99 + 100;
sum(97) +98 +99 +100;
...
...
...
sum(1) + 2 + 3....+ 100;
= 1 + 2 + 3 .... + 100;
***/
function sum($n) {
if($n>1) {
return sum($n-1) + $n;
} else {
return 1;
}
}
echo sum(100);
/*
用无赖法打印出级联目录来?
*/
<?php
/****
燕十八 公益PHP讲堂
论 坛: http://www.zixue.it
微 博: http://weibo.com/Yshiba
YY频道: 88354001
****/
/***
====笔记部分====
用耍赖法打印级联目录
***/
/*
谁会 递归打印级联目录?
思考:我不会打印级联目录,但是,我会打印一层目录,(这个单子可以接)
答:我会 recdir
*/
function recdir($path) {
$dh = opendir($path);
while(($row = readdir($dh)) !== false) {
if($row == '.' || $row == '..') {
continue;
}
echo $row,'<br />';
// 如果$row还是目录 怎么办?
if(is_dir($path . '/' .$row)) {
recdir($path . '/' .$row);
}
}
closedir($dh);
}
recdir('./');
<?php
/****
燕十八 公益PHP讲堂
论 坛: http://www.zixue.it
微 博: http://weibo.com/Yshiba
YY频道: 88354001
****/
/***
====笔记部分====
要想理解递归,你必须理解电影中的"慢动作".
要把函数的运行过程理解的非常慢
***/
/*
函数 调用 开始 执行
碰到 return 或 执行到最后结束
*/
function sum($n) {
if($n>1) {
$tmp = sum($n-1) + $n;
echo $n,'<br />';
return $tmp;
} else {
echo 1,'<br />';
return 1;
}
}
echo sum(5);
<?php
/****
燕十八 公益PHP讲堂
论 坛: http://www.zixue.it
微 博: http://weibo.com/Yshiba
YY频道: 88354001
****/
/***
====笔记部分====
写个函数模仿tree命令
***/
/*
├─
*/
function recdir($path,$lev=1) {
$dh = opendir($path);
while(($row = readdir($dh)) !== false) {
if($row == '.' || $row == '..') {
continue;
}
echo '├',str_repeat('─',$lev),$row,'<br />';
// 如果$row还是目录 怎么办?
if(is_dir($path . '/' .$row)) {
recdir($path . '/' .$row,$lev+1);
}
}
closedir($dh);
}
recdir('./',1);
/***
作业:
级联创建目录
按日期创建目录
array(
1=>array('安徽',0),
2=>array('北京',0),
3=>array('淮北',1),
4=>array('濉溪县',3)
)
array('淮北',1)
其中 淮北是地名, 1是其父地区.
利用递归,把地区的上下级关系 层次的打印出来!!!!
----无限级分类
***/
浙公网安备 33010602011771号