C++ 三元运算符中的递归函数是否求值两次?

C++ 三元运算符中的递归函数是否求值两次?,c++,recursion,C++,Recursion,我看到了一篇文章,其中有以下陈述: maxSubArray(A,i)=maxSubArray(A,i-1)>0?最大子阵(A,i-1):0+A[i]; 我的问题是,maxSubArray(A,i-1)是否会被计算(调用)两次(如果其值大于0)?这会增加代码的时间复杂度吗?我这样认为,因为我们最终会调用递归函数两次(如果它的值大于0) 编辑:以下是代码: public int-maxSubArray(int[]A){ int n=A.长度; int[]dp=new int[n];//dp[i]表

我看到了一篇文章,其中有以下陈述:

maxSubArray(A,i)=maxSubArray(A,i-1)>0?最大子阵(A,i-1):0+A[i];
我的问题是,
maxSubArray(A,i-1)
是否会被计算(调用)两次(如果其值大于0)?这会增加代码的时间复杂度吗?我这样认为,因为我们最终会调用递归函数两次(如果它的值大于0)

编辑:以下是代码:

public int-maxSubArray(int[]A){
int n=A.长度;
int[]dp=new int[n];//dp[i]表示以[i]结尾的最大子数组;
dp[0]=A[0];
int max=dp[0];
对于(int i=1;i0?dp[i-1]:0);
max=Math.max(max,dp[i]);
}
返回最大值;
}
这是我的答案。上述代码没有直接关系,因为我最初问题中的代码是自上而下的DP方法,而后面添加的代码是自下而上的DP方法。

这是:

只是
maxSubArray(a,i-1)
maxSubArray(a,i)
之间关系的伪代码表示法。它只是告诉我们当我们知道
i-1
的结果时,如何计算
i
的结果。像读数学符号一样读。类似于

y = 5 * x
描述

int foo(int x) { return x*5; }
在实际实施中,上述递归关系通过以下方式实现:

这里的
dp[i-1]
仅仅是访问数组的一个元素。两次访问同一数组元素对复杂性没有影响。假设
dp[i-1]
未在该行中修改,编译器可能会对其进行优化,以仅访问
dp[i-1]


在存在递归的情况下,不必要地调用函数两次可能会影响复杂性。考虑这个例子(从JAROD42窃取):


两者都产生相同的结果,但第一个具有线性复杂性,而第二个具有指数复杂性。

为什么不调用两次呢?什么方面的复杂性?做一件事两次只会增加一个常数,这个常数不算大O复杂度好吧,我指的是时间复杂度。我认为它会增加,因为我们最终可以调用递归函数两次(如果值>0)。我感觉这只是表示
maxSubArray(a,I)
maxSubArray(a,I-1)
之间的递归关系的一种方式,但实际上并不意味着是真正的代码。某些上下文可能是好的,它只是表示
maxSubArray(a,i)
maxSubArray(a,i-1)
之间的递归关系的一种方式。我知道一个简单的避免方法是预先将
maxSubArray(A,I-1)
的值存储在一个变量中;但是我很好奇上面写的是什么(时间复杂度增加了吗)。要知道这行中发生了什么,我们需要知道什么是
maxSubArray
。它出现在lhs上,所以它必须返回一些可赋值的东西,但它也出现在rhs上,这让我很困惑,因为它要么返回一个引用,你想在其中存储一些计算的结果,要么它返回一些计算的结果,但怎么可能两者都是呢?是否在循环中调用此函数以用结果填充某种数组?
int foo(int x) { return x*5; }
dp[i] = A[i] + (dp[i - 1] > 0 ? dp[i - 1] : 0);
int f(int n) { 
    if (n == 0) return 1; 
    return 2 * f(n - 1); 
} 

int f(int n) { 
    if (n == 0) return 1; 
    return f(n - 1) + f(n - 1);
}