📌  相关文章
📜  递归程序以查找数字的所有索引

📅  最后修改于: 2021-05-04 10:59:59             🧑  作者: Mango

给定大小为N的数组arr和整数X。任务是找到数组中整数X的所有索引

例子:

迭代方法很简单,只需遍历给定的数组,然后继续将元素的索引存储在另一个数组中。

递归方法

  • 如果起始索引达到数组的长度,则返回空数组
  • 否则,将数组的第一个元素保留在一起,并将数组的其余部分传递给递归。
    • 如果起始索引处的元素不等于x,则只需返回来自递归的答案即可。
    • 否则,如果起始索引处的元素等于x,则将数组元素(这是递归的答案)向右移动一步,然后将起始索引放在数组的前面(通过递归获得)

下面是上述方法的实现:

C++
// CPP program to find all indices of a number
#include 
using namespace std;
  
// A recursive function to find all
// indices of a number
int AllIndexesRecursive(int input[], int size,
                    int x, int output[])
{
      
    // If an empty array comes
    // to the function, then
    // return zero
    if (size == 0) {
        return 0;
    }
  
    // Getting the recursive answer
    int smallAns = AllIndexesRecursive(input + 1,
                                    size - 1, x, output);
  
    // If the element at index 0 is equal
    // to x then add 1 to the array values
    // and shift them right by 1 step
    if (input[0] == x) {
        for (int i = smallAns - 1; i >= 0; i--) {
            output[i + 1] = output[i] + 1;
        }
  
        // Put the start index in front
        // of the array
        output[0] = 0;
        smallAns++;
    }
    else {
          
        // If the element at index 0 is not equal
        // to x then add 1 to the array values
        for (int i = smallAns - 1; i >= 0; i--) {
            output[i] = output[i] + 1;
        }
    }
    return smallAns;
}
  
// Function to find all indices of a number
void AllIndexes(int input[], int n, int x)
{
    int output[n];
    int size = AllIndexesRecursive(input, n,
                                x, output);
    for (int i = 0; i < size; i++) {
        cout << output[i] << " ";
    }
}
  
// Driver Code
int main()
{
    int arr[] = { 1, 2, 3, 2, 2, 5 }, x = 2;
      
    int n = sizeof(arr) / sizeof(arr[0]);
      
    // Function call
    AllIndexes(arr, n, x);
      
    return 0;
}


Java
// Java program to find all
// indices of a number
public class GFG {
  
    public int[] AllIndexesRecursive(int input[],
                                int x, int start)
    {
        // If the start index reaches the
        // length of the array, then
        // return empty array
        if (start == input.length) {
            int[] ans = new int[0]; // empty array
            return ans;
        }
  
        // Getting the recursive answer in
        // smallIndex array
        int[] smallIndex = AllIndexesRecursive(input, x,
                                              start + 1);
  
        // If the element at start index is equal
        // to x then
        // (which is the answer of recursion) and then
        // (which came through recursion)
        if (input[start] == x) {
            int[] myAns = new int[smallIndex.length + 1];
  
            // Put the start index in front
            // of the array
            myAns[0] = start;
            for (int i = 0; i < smallIndex.length; i++) {
                  
                // Shift the elements of the array
                // one step to the right
                // and putting them in
                // myAns array
                myAns[i + 1] = smallIndex[i];
            }
            return myAns;
        }
        else {
              
            // If the element at start index is not
            // equal to x then just simply return the
            // answer which came from recursion.
            return smallIndex;
        }
    }
  
    public int[] AllIndexes(int input[], int x)
    {
  
        return AllIndexesRecursive(input, x, 0);
    }
      
    // Driver Code
    public static void main(String args[])
    {
        GFG g = new GFG();
        int arr[] = { 1, 2, 3, 2, 2, 5 }, x = 2;
          
        int output[] = g.AllIndexes(arr, x);
          
        // Printing the output array
        for (int i = 0; i < output.length; i++) {
            System.out.print(output[i] + " ");
        }
    }
}


Python3
# Python3 program to find all
# indices of a number
def AllIndexesRecursive(input, x, start):
      
    # If the start index reaches the
    # length of the array, then
    # return empty array
    if (start == len(input)):
        ans = [] # empty array
        return ans
  
    # Getting the recursive answer in
    # smallIndex array
    smallIndex = AllIndexesRecursive(input, x, 
                                     start + 1)
  
    # If the element at start index is equal
    # to x then
    # (which is the answer of recursion) and then
    # (which came through recursion)
    if (input[start] == x):
        myAns = [0 for i in range(len(smallIndex) + 1)]
  
        # Put the start index in front
        # of the array
        myAns[0] = start
        for i in range(len(smallIndex)):
  
            # Shift the elements of the array
            # one step to the right
            # and putting them in
            # myAns array
            myAns[i + 1] = smallIndex[i]
  
        return myAns
    else:
  
        # If the element at start index is not
        # equal to x then just simply return the
        # answer which came from recursion.
        return smallIndex
  
# Function to find all indices of a number
def AllIndexes(input, x):
  
    return AllIndexesRecursive(input, x, 0)
  
# Driver Code
arr = [ 1, 2, 3, 2, 2, 5 ]
x = 2
  
output=AllIndexes(arr, x)
  
# Printing the output array
for i in output:
    print(i, end = " ")
  
# This code is contributed by Mohit Kumar


C#
// C# program to find all
// indices of a number
using System;
class GFG 
{
    public int[] AllIndexesRecursive(int []input,
                                        int x, int start)
    {
        // If the start index reaches the
        // length of the array, then
        // return empty array
        if (start == input.Length) 
        {
            int[] ans = new int[0]; // empty array
            return ans;
        }
  
        // Getting the recursive answer in
        // smallIndex array
        int[] smallIndex = AllIndexesRecursive(input, x,
                                               start + 1);
  
        // If the element at start index is equal
        // to x then
        // (which is the answer of recursion) and 
        // then (which came through recursion)
        if (input[start] == x)
        {
            int[] myAns = new int[smallIndex.Length + 1];
  
            // Put the start index in front
            // of the array
            myAns[0] = start;
            for (int i = 0; i < smallIndex.Length; i++)
            {
                  
                // Shift the elements of the array
                // one step to the right
                // and putting them in
                // myAns array
                myAns[i + 1] = smallIndex[i];
            }
            return myAns;
        }
        else 
        {
              
            // If the element at start index is not
            // equal to x then just simply return the
            // answer which came from recursion.
            return smallIndex;
        }
    }
  
    public int[] AllIndexes(int []input, int x)
    {
        return AllIndexesRecursive(input, x, 0);
    }
      
    // Driver Code
    public static void Main()
    {
        GFG g = new GFG();
        int []arr = { 1, 2, 3, 2, 2, 5 };
        int x = 2;
          
        int []output = g.AllIndexes(arr, x);
          
        // Printing the output array
        for (int i = 0; i < output.Length; i++) 
        {
            Console.Write(output[i] + " ");
        }
    }
}
  
// This code is contributed by anuj_67..


输出:
1 3 4