数学问题:循环或递归

jer*_*oen 1 php math recursion loops

我试图以一种方式将数字分解为数组(在php中),例如:

  • 25变成(16,8,1)
  • 8成为(8)
  • 11变为(8,2,1)

我不知道正确的用语是什么,但我认为这个想法很明确.

我的循环解决方案非常简单:

   $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())之类的东西似乎对于像这样的简单问题有点多.

在我看来,问题需要一个非常简单的数学递归解决方案,但我只是没有看到它.

任何帮助都会被贬低.

编辑:二进制是关键,非常感谢!

Bre*_*dan 7

你可以得到数字的二进制表示 - 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中可能有更好的语法分析方法.