jer*_*oen 1 php math recursion loops
我试图以一种方式将数字分解为数组(在php中),例如:
我不知道正确的用语是什么,但我认为这个想法很明确.
我的循环解决方案非常简单:
$number = rand(0, 128);
$number_array_loop = array();
$temp_number = $number;
while ($temp_number > 0) {
$found_number = pow(2, floor(log($temp_number, 2)));
$temp_number -= $found_number;
$number_array_loop[] = $found_number;
}
Run Code Online (Sandbox Code Playgroud)
我也有一个递归的解决方案,但是我不能在不使用全局变量的情况下工作(不想这样),以下内容接近但会导致数组中的数组:
function get_numbers($rest_number) {
$found_number = pow(2, floor(log($rest_number, 2)));
if ($found_number > 0) {
$temp_array[] = get_numbers($rest_number - $found_number);
$temp_array[] = $found_number;
}
return $temp_array;
}
$number_array_recursive = array();
$number_array_recursive = get_numbers($number);
Run Code Online (Sandbox Code Playgroud)
然而,使用诸如pow(floor(log())之类的东西似乎对于像这样的简单问题有点多.
在我看来,问题需要一个非常简单的数学递归解决方案,但我只是没有看到它.
任何帮助都会被贬低.
编辑:二进制是关键,非常感谢!
你可以得到数字的二进制表示 - 1表示包括2的幂,零表示不
即
$binary_number = decbin($test_number);
$binary_string = "${binary_number}";
for ($i = 0; $i < strlen($binary_string); $i++) {
if ($binary_string[strlen($binary_string) - $i - 1] == "1") {
$num_out = pow(2, $i);
print "${num_out} ";
}
}
Run Code Online (Sandbox Code Playgroud)
这已经过测试并且可以正常运行但是在PHP中可能有更好的语法分析方法.