python 函数和 php 转换的不同输出
Different output from python function and php conversion
我尝试转换以下python函数
def Sous(dist,d) :
l=len(dist)
L=[[]]
for i in range(l) :
K=[]
s=sum(dist[i+1:])
for p in L :
q=sum(p)
m=max(d-q-s,0)
M=min(dist[i],d-q)
for j in range(m,M+1) :
K.append(p+[j])
L=K
return L
print(Sous([3,2,1,0],2))
进入PHP函数
function sous($dist, $d){
$l = count($dist);
$L = [[]];
foreach(range(0,$l - 1) as $i){
$K = [];
$s = array_sum(array_slice($dist, $i+1));
foreach($L as $p){
$q = array_sum($p);
$m = max($d-$q-$s, 0);
$M = min($dist[$i], $d-$q);
foreach(range($m, $M+1) as $j){
$K[] = $p+[$j];
}
}
$L = $K;
}
return $L;
}
print_r(sous([3,2,1,0],2));
但是当我得到 python 函数的正确输出时:
[[0, 1, 1, 0], [0, 2, 0, 0], [1, 0, 1, 0], [1, 1, 0, 0], [2, 0, 0, 0]]
我得到一个错误的 PHP 转换输出
Array
(
[0] => Array
(
[0] => 0
)
[1] => Array
(
[0] => 0
)
[2] => Array
(
[0] => 0
)
[3] => Array
(
[0] => 0
)
[4] => Array
(
[0] => 0
)
...
我找不到 PHP 转换中的问题所在,因为我不太理解我尝试转换的代码。
你知道我哪里做错了吗?
问题出在以下 Python 语句的翻译中:
K.append(p+[j])
p+[j]
将根据列表 p
并附加元素 j
创建一个新列表,而原始列表保持不变。因此,等效的 PHP 翻译为:
$p_copy = $p;
$p_copy[] = $j;
$K[] = $p_copy;
我也不得不更换:
foreach(range($m, $M+1) as $j){
与:
foreach(range($m, $M) as $j){
综合起来:
<?php
function sous($dist, $d){
$l = count($dist);
$L = [[]];
foreach(range(0,$l - 1) as $i){
$K = [];
$s = array_sum(array_slice($dist, $i+1));
foreach($L as $p){
$q = array_sum($p);
$m = max($d-$q-$s, 0);
$M = min($dist[$i], $d-$q);
foreach(range($m, $M) as $j){
$p_copy = $p;
$p_copy[] = $j;
$K[] = $p_copy;
}
}
$L = $K;
}
return $L;
}
print_r(sous([3,2,1,0], 2));
打印:
Array
(
[0] => Array
(
[0] => 0
[1] => 1
[2] => 1
[3] => 0
)
[1] => Array
(
[0] => 0
[1] => 2
[2] => 0
[3] => 0
)
[2] => Array
(
[0] => 1
[1] => 0
[2] => 1
[3] => 0
)
[3] => Array
(
[0] => 1
[1] => 1
[2] => 0
[3] => 0
)
[4] => Array
(
[0] => 2
[1] => 0
[2] => 0
[3] => 0
)
)
我尝试转换以下python函数
def Sous(dist,d) :
l=len(dist)
L=[[]]
for i in range(l) :
K=[]
s=sum(dist[i+1:])
for p in L :
q=sum(p)
m=max(d-q-s,0)
M=min(dist[i],d-q)
for j in range(m,M+1) :
K.append(p+[j])
L=K
return L
print(Sous([3,2,1,0],2))
进入PHP函数
function sous($dist, $d){
$l = count($dist);
$L = [[]];
foreach(range(0,$l - 1) as $i){
$K = [];
$s = array_sum(array_slice($dist, $i+1));
foreach($L as $p){
$q = array_sum($p);
$m = max($d-$q-$s, 0);
$M = min($dist[$i], $d-$q);
foreach(range($m, $M+1) as $j){
$K[] = $p+[$j];
}
}
$L = $K;
}
return $L;
}
print_r(sous([3,2,1,0],2));
但是当我得到 python 函数的正确输出时:
[[0, 1, 1, 0], [0, 2, 0, 0], [1, 0, 1, 0], [1, 1, 0, 0], [2, 0, 0, 0]]
我得到一个错误的 PHP 转换输出
Array
(
[0] => Array
(
[0] => 0
)
[1] => Array
(
[0] => 0
)
[2] => Array
(
[0] => 0
)
[3] => Array
(
[0] => 0
)
[4] => Array
(
[0] => 0
)
...
我找不到 PHP 转换中的问题所在,因为我不太理解我尝试转换的代码。 你知道我哪里做错了吗?
问题出在以下 Python 语句的翻译中:
K.append(p+[j])
p+[j]
将根据列表 p
并附加元素 j
创建一个新列表,而原始列表保持不变。因此,等效的 PHP 翻译为:
$p_copy = $p;
$p_copy[] = $j;
$K[] = $p_copy;
我也不得不更换:
foreach(range($m, $M+1) as $j){
与:
foreach(range($m, $M) as $j){
综合起来:
<?php
function sous($dist, $d){
$l = count($dist);
$L = [[]];
foreach(range(0,$l - 1) as $i){
$K = [];
$s = array_sum(array_slice($dist, $i+1));
foreach($L as $p){
$q = array_sum($p);
$m = max($d-$q-$s, 0);
$M = min($dist[$i], $d-$q);
foreach(range($m, $M) as $j){
$p_copy = $p;
$p_copy[] = $j;
$K[] = $p_copy;
}
}
$L = $K;
}
return $L;
}
print_r(sous([3,2,1,0], 2));
打印:
Array
(
[0] => Array
(
[0] => 0
[1] => 1
[2] => 1
[3] => 0
)
[1] => Array
(
[0] => 0
[1] => 2
[2] => 0
[3] => 0
)
[2] => Array
(
[0] => 1
[1] => 0
[2] => 1
[3] => 0
)
[3] => Array
(
[0] => 1
[1] => 1
[2] => 0
[3] => 0
)
[4] => Array
(
[0] => 2
[1] => 0
[2] => 0
[3] => 0
)
)