#include <iostream>
using namespace std;
int g(float A[] , int L , int H)
{
if (L==H)
if (A[L] > 0.0)
return 1;
else
return 0;
int M = (L+H)/2;
return g(A,L,M)+ g(A,M+1,H);
}
int main (void)
{
float A[] = {-1.5 ,3.1,-5.2,0.0};
g(A,0,3);
system ("pause");
return 0;
}
它问我函数g返回什么以及函数做什么
这是我到目前为止所得到的
第一个电话是g(A,0,3) -total跳过IF语句,M = 1,因为它是一个int - 返回g(A,1,3)+ g(A,2 3)
第二次电话 - g(A,1,3)再次跳过if语句 - M = 0; - g(A,2 3)再次跳过if语句 - M = 2; 第三个电话 -g(A,0,0,) 返回0 -g(A,3,3) 返回0;所以它只返回0?
我猜它正在划分中间值和某种二分搜索?
答案 0 :(得分:4)
这是一种复杂的方法来计算数组中有多少数字大于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}
。
@Nawaz很清楚将其可视化为二叉树,基本上你从树的根开始:
{-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
最后
{{1}}
答案 1 :(得分:3)
且M = 1,因为它是一个回归g(A,0,3)+ g(A,2 3)
这是第一个问题。如果M = 1,那你怎么说它是return g(A,0,3) + g(A,2, 3)
?
应该是:
return g(A,0,1) + g(A,2, 3)
//^ this should be 1
由于你在第一步出错,所有连续的步骤都是错误的。
我的建议是:
g(A,0,3);
。这是第一次电话。g(A,0,1)
写为左侧节点,将g(A,2,3)
写为右侧节点。if
条件成为真。if
条件成立,停止制作新节点(在该分支中),然后向上移向根节点,对在途中遇到的节点的值求和。main()
的原始呼叫的返回值。