Skip to main content
 首页 » 编程设计

php之在将 Python 代码转换为 PHP 时发现一个逻辑错误

2024年08月12日29qq78292959

输入 7|12|1|14|2|13|8|11|16|3|10|5|9|6|15|4 通过 PHP 代码返回 0 ,而 1 通过 Python 代码:1 表示 4x4 幻方的和相同,而 0 表示相反。 Python代码是正确的。

PHP 代码的问题似乎出在函数 divide 的 for 循环中,因为 PHP 给出了太多的总和。

PHP 代码的逻辑与 Python 有何不同?

PHP

$data = "7|12|1|14|2|13|8|11|16|3|10|5|9|6|15|4"; 
$array = explode("|", $data); 
 
# Calculate the unique sums of the four figures 
# @return array int 
function divide ( $array ) { 
        $sum = array_map('array_sum', array_chunk($array, 4)); 
        $apu_a = array(); 
        for ( $i = 0; $i < count( $sum ); $i++ ) { 
                if ( $i % 5 == 0 ) 
                        $apu_a []= $array[$i]; 
        } 
        $sum []= array_sum( $apu_a ); 
 
        $apu_a = array(); 
        for ( $i = 0; $i < count( $sum ); $i++ ) { 
                if ( $i % 3 == 0 and $i != 15 and $i != 0 ) 
                        $apu_a []= $array[$i]; 
        } 
        $sum []= array_sum( $apu_a ); 
 
        $result = array_unique($sum); 
        return $result; 
} 

python

data = "7|12|1|14|2|13|8|11|16|3|10|5|9|6|15|4" 
lista = map(int,data.split("|")) 
 
def divide( lista ): 
        summat = [sum(lista[i:i+4]) for i in range(0,len(lista),4)] 
        summat += [sum(lista[0::5]) for i in range(0, len(lista), 16)] 
        summat += [sum(a for i,a in enumerate(lista) if i %3==0 and i != 15 and i != 0)] 
        return set(summat) 

请您参考如下方法:

问题出在您的 PHP 行中:

for ( $i = 0; $i < count( $sum ); $i++ ) { 

你想要:

for ( $i = 0; $i < count( $array ); $i++ ) { 

在两个地方都修正它,你就会得到正确的答案。

顺便说一句:您只检查主对角线,但您也可以检查其他环绕对角线,正如 Greg 指出的那样,您永远不会对列求和。