今天写了一个递归,0-10中随机获取2个不重复的数字结果遇到了坑
public function getRandNum($max=10,$arr = array() ){
$rand = intval(rand(0,$max));
if(!in_array($rand, $arr )){
return $rand;
}else{
$this->getRandNum($max,$arr);
}
}
其实也不算什么问题,只是自己一时没转过来,后来想通了也就明白了,这其实是一个很低级的错误。但还是记录一下,防止以后再出现这类问题浪费时间
这段代码第一次执行时候没有问题,当$arr里有值的时候再去执行就有可能会出现取到null的情况,是什么原因呢,可以一步一步往下走一遍
比如第一次:$this->getRandNum(10,array());会正常返回一个0-10的值,比如第一次返回1,这时候再去执行第二次$arr里边是有一个值的应该是这样:$this->getRandNum(10,array(1));这个时候就有可能出现还随机到1的情况,这样就会执行else里边的部分。这时候问题就来了,当执行else的时候就会出问题,因为else会再执行一次getRandNum,这时候还会重复上面的流程,如果随机到一个不为1的值,会正常return,否则会继续执行,但这个不管重复多少遍,肯定会有正确返回的情况,这时候最终会返回一个正常的值,但我们在else 里并没有接收这个值,也没有其他操作,到这里就停住了。所以当我们执行完getRandNum的时候实际是收不到返回值的。所以正确的应该是这样:
public function getRandNum($max=10,$arr = array() ){
$rand = intval(rand(0,$max));
if(!in_array($rand, $arr )){
return $rand;
}else{
return $this->getRandNum($max,$arr);
}
}
在else里加一个return,当执行else的时候,最终我们也会接收到一个正确的返回值,直接返回就行了。
网友评论