📜  尾递归以计算数组元素的总和。

📅  最后修改于: 2021-05-04 12:56:34             🧑  作者: Mango

给定一个数组A [],我们需要使用尾递归方法找到其元素的总和。我们通常希望实现尾部递归(一种递归函数,其中递归调用是函数执行的最后一件事),以便编译器可以优化代码。基本上,如果递归调用是最后一条语句,则编译器不需要保存父调用的状态。
例子:

Input : A[] = {1, 8, 9}
Output : 18

Input : A[] = {2, 55, 1, 7}
Output : 65

有关线性递归方法,请参阅:https://www.geeksforgeeks.org/sum-array-elements-using-recursion/

逻辑:在此,尾部递归的关键是对函数调用进行的任何操作,请将其维护为单独的函数参数。
因此,将最后元素K个元素的和作为函数参数,并在K = 0时返回和。

C++
#include 
using namespace std;
  
// Tail recursive function
int arrSum(int* array, int size, int sum = 0)
{
    // Base Case
    if (size == 0) 
        return sum;
  
    // Function Call Observe sum+array[size-1]
    // to maintain sum of elements
    return arrSum(array, size - 1, sum + array[size - 1]);
}
  
int main()
{
    int array[] = { 2, 55, 1, 7 };
    int size = sizeof(array) / sizeof(array[0]);
    cout << arrSum(array, size);
    return 0;
}


Java
// Java implementation of the given approach.
class GFG
{
  
// Tail recursive function
static int arrSum(int []array, int size, int sum)
{
    // Base Case
    if (size == 0) 
        return sum;
  
    // Function Call Observe sum+array[size-1]
    // to maintain sum of elements
    return arrSum(array, size - 1, sum + array[size - 1]);
}
  
// Driver code
public static void main(String[] args)
{
    int array[] = { 2, 55, 1, 7 };
    int size = array.length;
    System.out.print(arrSum(array, size, 0));
}
}
  
// This code is contributed by Rajput-Ji


Python3
# Python3 implementation of the given approach.
  
# Tail recursive function 
def arrSum(array, size, Sum = 0): 
  
    # Base Case 
    if size == 0: 
        return Sum
  
    # Function Call Observe sum+array[size-1] 
    # to maintain sum of elements 
    return arrSum(array, size - 1,
            Sum + array[size - 1]) 
  
# Driver Code
if __name__ == "__main__":
  
    array = [2, 55, 1, 7] 
    size = len(array) 
    print(arrSum(array, size)) 
  
# This code is contributed by Rituraj Jain


C#
// C# implementation of the given approach.
using System;
  
class GFG
{
  
// Tail recursive function
static int arrSum(int []array, int size, int sum)
{
    // Base Case
    if (size == 0) 
        return sum;
  
    // Function Call Observe sum+array[size-1]
    // to maintain sum of elements
    return arrSum(array, size - 1, sum + array[size - 1]);
}
  
// Driver code
public static void Main(String[] args)
{
    int []array = { 2, 55, 1, 7 };
    int size = array.Length;
    Console.WriteLine(arrSum(array, size, 0));
}
}
  
// This code is contributed by 29AjayKumar


输出:
65

时间复杂度: O(n)