Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何返回所有求和为给定正整数的数字序列?_Php_Algorithm - Fatal编程技术网

Php 如何返回所有求和为给定正整数的数字序列?

Php 如何返回所有求和为给定正整数的数字序列?,php,algorithm,Php,Algorithm,例如,输入3将返回[1,1,1]、[2,1]和[1,2] 我知道很多组合/置换问题都涉及一个在循环内部调用自身的递归函数,但我找不到合适的方法将其应用于这个问题 这是一个我正在努力掌握的概念,以下是我到目前为止所掌握的 function numberToAddends($number, $arr, $k){ for ($i = 0; $i < $number; $i++) { $arr[$k] = $i; numberToAddends($k-$i,

例如,输入3将返回[1,1,1]、[2,1]和[1,2]

我知道很多组合/置换问题都涉及一个在循环内部调用自身的递归函数,但我找不到合适的方法将其应用于这个问题

这是一个我正在努力掌握的概念,以下是我到目前为止所掌握的

function numberToAddends($number, $arr, $k){
    for ($i = 0; $i < $number; $i++) {
        $arr[$k] = $i;
        numberToAddends($k-$i, $arr, $k + 1);
    }

    if($k <=0){
        print_r($arr);
    }
}
函数编号加法器($number,$arr,$k){
对于($i=0;$i<$number;$i++){
$arr[$k]=$i;
数字加数($k-$i,$arr,$k+1);
}

如果($k你要找的概念是一个数字的“整数分区”。谷歌应该给你指出很多代码,或者寻找解释和代码


基本思想是一个简单的递归过程。有一个0的分区,即空集()。有一个1的分区,即集合(1)。有两个2的分区,即集合(1)和(2)。有三个3的分区,即集合(1 1 1)、(1 2)和(3)。有五个4的分区,即集合(1 1 1)、(1 2)、(1 3)、(2)和(3)(4) 。有七个5的分区,集合(1 1 1 1)、(1 1 2)、(1 2)、(1 1 3)、(1 4)、(2 3)和(5)等等。在每种情况下,下一个较大的分区集合是通过将小于或等于所需整数n的每个整数x添加到由n的分区形成的所有集合中来确定的− x、 消除任何重复项。

这里有一个算法,通过重用从1到n的子结果来解决此问题:

$number=3;
$addends=数组();
对于($x=1;$x0;$y--){
foreach($加上[$y]作为$z){
$addends[$x][]=array_merge($z,array($x-$y));
}
}
$addends[$x][]=数组($x);
}
var_dump($加数);

这将通过将任何y是否应该给出
[3]
作为一种解决方案?注释代码,一些咖啡,也许是一个不错的甜甜圈?不,除了原始的数字类似于斐波那契,从1到n而不是从n到1构建结果。通过这样做,你可以重用任何1…n-1的结果。关闭不是一个真正的问题?但他只是在问整数分区,Knuth已经写过第4A卷第3分册的大部分内容都是关于它的!
$number = 3;
$addends = array();
for ($x=1; $x<=$number; $x++) {
    $addends[$x] = array();
    for ($y=$x-1; $y>0; $y--) {
        foreach ($addends[$y] as $z) {
            $addends[$x][] = array_merge($z, array($x-$y));
        }
    }
    $addends[$x][] = array($x);
}
var_dump($addends);