【问题标题】:Transforming 4 sum problem from non-recursive to recursive function将 4 sum 问题从非递归转换为递归函数
【发布时间】:2021-07-25 21:04:48
【问题描述】:

我需要实现一个递归函数(它 接受 Array 和 sum 作为参数)来检查它是否包含四个元素 有给定的总和。

例如:

int[] intArray = {12, 18, 3, 2, 8, 2, 3, 5};

总和 = 35

输出: 存在四胞胎。

我创建了第一个非递归函数,然后尝试将其转换为递归函数,但没有成功。

这是我的非递归函数:

public class NonRecursive4Sum {

  void FourElementsSum (int arr[], int n, int X)
    {
        // In first step we save first number and search for other 3
        for (int i = 0; i < n - 3; i++)
        {
            // Save 2. number and search for 2
            for (int j = i + 1; j < n - 2; j++)
            {
                // Save 3. and search for last one
                for (int k = j + 1; k < n - 1; k++)
                {
                    // Here we save last number
                    for (int l = k + 1; l < n; l++)
                    {
                        // This is the part I am trying to transform to recursive function
                        if (arr[i] + arr[j] + arr[k] + arr[l] == X){
                            System.out.print("Quadruplets exists");
                        }
                    }
                }
            }
        }
    }
 
    
    public static void main(String[] args)
    {
        NonRecursive4Sum findfour = new NonRecursive4Sum ();
        int[] intArray= {12, 18, 3, 2, 8, 2, 3, 5};
       
        
        findfour.FourElementsSum(intArray, 8, 35);
    }
}

这是我尝试转换为递归函数的 if 语句:

if (arr[i] + arr[j] + arr[k] + arr[l] != X){
                            FourElementsSum ();
                        }
                        else if(arr[i] + arr[j] + arr[k] + arr[l] == X) {
                            System.out.println("Quadruplets Exist");
                        }

【问题讨论】:

  • 不在这里发帖,如果你只是谷歌,你可以在网上找到解决方案:techiedelight.com/4-sum-problem
  • 谢谢 Shubham,我只是对它是否可以从 for 循环创建递归函数感兴趣。

标签: java arrays if-statement recursion transform


【解决方案1】:

如果你想要一个有效的解决方案 - 你可以去这个link

如果你想将你的 for 循环转换为递归函数,你可以尝试这样的事情:

public static boolean FourElementsSumRecursive (int arr[], int n, int X, int i, int j, int k, int l)
    {
        //reached the end. no sums add up to X
        if(i>=n-3 || j>=n-2 || k>=n-1 || l>=n){
            return false;
        }
        
        //Found a quadruplet
        if (arr[i] + arr[j] + arr[k] + arr[l] == X){
            return true;
        }
        
        
        //increase i, j, k, l for all combinations
        return FourElementsSumRecursive(arr, n, X, i+1, j, k, l) || FourElementsSumRecursive(arr, n, X, i, j+1, k, l) || FourElementsSumRecursive(arr, n, X, i, j, k+1, l) || FourElementsSumRecursive(arr, n, X, i, j, k, l+1);
    }

   
int X = 35;
boolean didFindQuadruplet = findfour.FourElementsSumRecursive(intArray, intArray.length, X, 0, 1, 2, 3); 
//true for X=35

【讨论】:

  • 感谢一百万 @Shubham Periwal,这是完美的工作。
  • 那你介意接受这个答案吗?所以它不再显示为“未回答的问题”
  • 我是堆栈溢出的新手,你能告诉我怎么做吗?谢谢
  • 左边我的答案旁边一定有一个“勾号”。如果你找不到它,也许这会有所帮助:stackoverflow.com/help/someone-answers 欢迎来到 StackOverflow :)
  • 我找到了,我也会投票,但我仍然没有投票权。再次感谢一百万 Shubham。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
  • 2019-09-14
  • 1970-01-01
相关资源
最近更新 更多