Это сложный способ подсчитать, сколько чисел в массиве больше 0. И если вы попытаетесь запустить это в компиляторе, возвращаемое значение будет 1, потому что единственное число, которое больше 0 в массиве, это 3.1 .
при первом запуске:
{-1.5, 3.1, -5.2, 0.0}
0 1 2 3
L H
затем, начиная с L=0
и H=3
, M = (0+3)/2 = 3/2 = 1
, когда вы достигаете g(A, L, M) + g(A, M+1, H)
, вы разветвляетесь на две части:
{-1.5, 3.1, -5.2, 0.0}
0 1 2 3
L H
L1 H1 L2 H2
давайте сначала сделаем левую часть g(A, L1, H1) = g(A, 0, 1)
:
{-1.5, 3.1, -5.2, 0.0}
0 1 2 3
L H
L1 H1 L2 H2
^^^^^^^
снова с L1=0
, H1=1
и т. Д. M1 = (0+1)/2 = 1/2 = 0
и вы снова разветвляетесь на две части g(A, 0, 0)
и g(A, 1, 1)
:
{-1.5, 3.1, -5.2, 0.0}
0 1 2 3
L H
L1 H1 L2 H2
L11,H11 L12,H12
в левой части, начиная с -1.5 <= 0
, следовательно, g(A, L11, H11) = g(A, 0, 0) = 0
, в правой части, начиная с 3.1 > 0
, следовательно, g(A, L12, H12) = g(A, 1, 1) = 1
.
Итак, поэтому g(A, 0, 1) = g(A, 0, 0) + g(A, 1, 1) = 1
.
Сделайте то же самое с g(A, L2, H2)
, и вы получите это g(A, L, H) = g(A, L1, H1) + g(A, L2, H2) = 1 + 0 = 1
.
@ У Наваза была хорошая идея визуализировать это в двоичное дерево, в основном вы начинаете с корня дерева:
{-1.5, 3.1, -5.2, 0.0}
На втором уровне итерации вы разбиваете массив на два:
{-1.5, 3.1, -5.2, 0.0}
/ \
/ \
/ \
/ \
{-1.5, 3.1} {-5.2, 0.0}
На третьем слое вы снова делитесь:
{-1.5, 3.1, -5.2, 0.0}
/ \
/ \
/ \
/ \
{-1.5, 3.1} {-5.2, 0.0}
/ \ / \
/ \ / \
{-1.5} {3.1} {-5.2} {0.0}
На данный момент L==H
, поэтому мы можем оценить узлы:
{-1.5, 3.1, -5.2, 0.0}
/ \
/ \
/ \
/ \
{-1.5, 3.1} {-5.2, 0.0}
/ \ / \
/ \ / \
{-1.5} {3.1} {-5.2} {0.0}
| | | |
0 1 0 0
и чтобы найти возвращаемые значения, мы подытожим:
{-1.5, 3.1, -5.2, 0.0}
/ \
/ \
/ \
/ \
{-1.5, 3.1} {-5.2, 0.0}
0+1=1 0+0=0
и, наконец,
{-1.5, 3.1, -5.2, 0.0}
1+0=1