php面试题递归,面试题:如何使用PHP递归算法算出如下数字?

//前提,a,b,c,d,e,f,g,p=1 互不相同

function abc($array,$start,$end){

list($a,$b,$c,$d,$e,$f,$g,$h,$p)=$array;

if(10*$a+$b-10*$c-$d==10*$e+$f){

if(10*$e+$f+10*$g+$h==111){

echo json_encode($array); //输出,直接输出个数组,【a,b,c,d,e,f,g,h,p,多余项】

return ;

}

}

for($i=$start+1;$i

$array1=$array;

$array1[$start]=$array[$i];

$array1[$i]=$array[$start];

abc($array1,$start+1,$end);//递归

}

}

abc([0,2,3,4,5,6,7,8,9],0,9);

这样写我试了下,挺快的,一秒以内吧

不好意思,输出错了啊,没有输出p,想输出p的话,当然输出形式你可以随便定义

把 if(10$e+$f+10$g+$h==111){

改为 if(10$e+$f+10$g+$h==111*p){

以及 abc([0,2,3,4,5,6,7,8,9],0,9);

改为 abc([0,1,2,3,4,5,6,7,8,9],0,10);

希望是你要的答案

不好意思,突然想到此代码存在错误,然后就过来改一下

(我也不知道为什么我在写项目时,还会想起这个 T_T )

重新给出代码,以及思路

先说思路,根据题意,这题里面9个数字应该互不相同,排列组合共有10!的可能。

我们将这10个数字依次列出来,其中有一个是不需要的。

问题转换为怎么实现这10!的可能,我的答案就是交换,一次交换其中的两个数字。

于是自然而然想到递归,先判断当前情形是否满足条件,满足则输出。

当然其实这里还有个错误,此时不应该立即return,修改方法很多,比如把判断移到for后面;

【比如我初始条件就是一个正确答案,则输出一个就结束了,随便尝试改一下。】

然后将目标位$start与之后的每一位分别进行交换,目标位后移,递归,直到结束。

此时罗列出了所有的可能,只要满足判断就可以输出了,去掉时间函数,15行内搞定。

用时3秒,吧$p=1写死,如我上面做的,则可以在0.5秒内结束。

【这回大概不会有错了,继续写项目了 。。。 】

function abc($array,$start,$end){

list($a,$b,$c,$d,$e,$f,$g,$h,$p)=$array;

if(10*$a+$b-10*$c-$d==10*$e+$f){

if(10*$e+$f+10*$g+$h==111*$p){

echo json_encode($array)."\r\n";

return ;

}

}

for($i=$start;$i

$array1=$array;

$array1[$start]=$array[$i];

$array1[$i]=$array[$start];

abc($array1,$start+1,$end);

}

}

function getMillisecond() {

list($t1, $t2) = explode(' ', microtime());

return (float)sprintf('%.0f',(floatval($t1)+floatval($t2))*1000);

}

$a=getMillisecond();

abc([0,1,2,3,4,5,6,7,8,9],0,10);

$b=getMillisecond();

echo ($b-$a)."ms";

//输出数组的最后一个数字是多余项,懒得改了

C:\Users\shentianmei\Desktop>php a.php

[3,4,0,9,2,5,8,6,1,7]

[3,6,0,9,2,7,8,4,1,5]

[4,5,0,6,3,9,7,2,1,8]

[5,2,0,9,4,3,6,8,1,7]

[5,7,0,8,4,9,6,2,1,3]

[5,7,0,9,4,8,6,3,1,2]

[7,2,0,9,6,3,4,8,1,5]

[8,4,0,5,7,9,3,2,1,6]

[8,4,0,9,7,5,3,6,1,2]

[8,5,4,6,3,9,7,2,1,0]

[8,5,0,6,7,9,3,2,1,4]

[8,6,5,4,3,2,7,9,1,0]

[9,3,0,6,8,7,2,4,1,5]

[9,3,0,7,8,6,2,5,1,4]

[9,5,2,7,6,8,4,3,1,0]

[9,0,2,7,6,3,4,8,1,5]

[9,0,6,3,2,7,8,4,1,5]

3021ms

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值