1

値が 2^($blocksize) である変数「totalIPaddress」を計算する必要がある場合、これに対する xquery ステートメントは何でしょうか?

<IPaddress>
<startIPaddress>192.168.1.1</startIPaddress>
<blocksize>4</blocksize>
</IPaddress>
4

3 に答える 3

2

これは、対数時間の複雑さ (O(log(N))) を使用して、べき乗を計算する特に効率的な方法です。

declare function local:pow($x as xs:double , $n as xs:integer ) as xs:double
{
  if($n eq 0)
   then 1
   else
    (let $h := $n idiv 2,
         $halfResult := local:pow($x, $h)
      return
            if($n mod 2 eq 0)
              then $halfResult * $halfResult
              else $x * $halfResult * $halfResult
        )

};

local:pow(2,10)

期待される正しい結果を生成します:

1024
于 2013-03-13T03:53:20.280 に答える
0

math:pow を除いて、最も簡単な方法はハードコードすることです:

(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648, 4294967296)[$blocksize + 1]

XPath 2 でも動作します。

于 2013-03-12T14:13:01.053 に答える
0

再帰はあなたの友達です:

declare function f:two-to-the($n as xs:integer) as xs:integer {
  if ($n = 0) then 1 else 2 * f:two-to-the($n - 1)
};
于 2013-03-12T18:49:22.640 に答える