字体:  

递归中如何返回正确的累加变量(附实际应用)

七月十五 发表于: 2008-9-11 16:44 来源: PHPChina 开源社区门户



[ 本帖最后由 七月十五 于 2008-9-12 09:56 编辑 ]

最新回复

生命如蓝 at 2008-9-11 16:47:42
那就用静态变量呗。
mrhhsg at 2008-9-11 16:48:12
这个函数有问题在else里面没有return
七月十五 at 2008-9-11 16:49:41

QUOTE:

原帖由 生命如蓝 于 2008-9-11 16:47 发表
那就用静态变量呗。
你用static试试看
生命如蓝 at 2008-9-11 16:50:04
果然。
七月十五 at 2008-9-11 16:50:19

QUOTE:

原帖由 mrhhsg 于 2008-9-11 16:48 发表
这个函数有问题在else里面没有return
哦?
愿闻其详,请用代码解答。
mrhhsg at 2008-9-11 16:51:29
function times($n) {
    if(!isset($i)) { $i = 0; }
    if($n <= 0) {
        return $i;  //如何返回正确的执行次数
    } else {
        $n -= mt_rand(0, 10);
       $i = $i + times($n);
       return $i;
    }
}
生命如蓝 at 2008-9-11 16:55:27
programmerhuang at 2008-9-11 16:58:20
是要累加次数, 还是要times(递归)调用次数呀?
下面是调用次数的:
mrhhsg at 2008-9-11 16:59:15
楼上这个函数对了
七月十五 at 2008-9-11 16:59:39
果然不错
programmerhuang at 2008-9-11 17:02:06
用静态你要注意清除, 第二次再调用(不是内部递归调用)的时候, 就会累加了上次的了
生命如蓝 at 2008-9-11 17:04:30

记下了。谢。
blankyao at 2008-9-11 17:27:32
豌豆兄的程序很好理解,但是用静态变量为什么返回不了呢?
看下如下程序

返回值为
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 fuck40NULL

可以看得出,在return之前,$i是有值的,但是return $i的时候$i就为NULL了,这是怎么回事呢?

[ 本帖最后由 blankyao 于 2008-9-11 17:34 编辑 ]
mrhhsg at 2008-9-11 17:36:24
你发现没有,在else里面没有返回
blankyao at 2008-9-11 17:39:03
我发现了,但是return之前的echo "fuck".$i已经执行了,为啥return就没执行呢?
mrhhsg at 2008-9-11 17:45:38
var_dump(times(200));
函数直接就跳到else里面去了,当然没有返回
其他的返回是在递归里面的返回
programmerhuang at 2008-9-11 19:26:01
对, 你的else代码段中没有返回值.
echo "fuck" . $i;之后 的return $i;是有执行的
但是在递归调用是深一次执行的, 而你后面的var_dump的是最外面一层调用, 除了最深一层会运行if代码段中的程序, 其它的都是调用else中的.
你可以在else中加个return $i; 像这样:
七月十五 at 2008-9-11 19:42:27


高级区就是不一样
谢谢。
blankyao at 2008-9-12 08:20:32
谢谢豌豆,我递归没学好 :(
七月十五 at 2008-9-12 08:23:59
谢谢各位大大让我们菜菜加深理解递归
单纯用echo来做的递归不太实用
带return才更能用在程序里,特别是MVC模式下

谢谢