给定一个数组,使用递归生成给定数组的所有可能的子数组。
例子:
Input : [1, 2, 3]
Output : [1], [1, 2], [2], [1, 2, 3], [2, 3], [3]
Input : [1, 2]
Output : [1], [1, 2], [2]
我们已经讨论了生成所有子数组的迭代程序。在这篇文章中,讨论了递归。
方法:我们使用两个指针start和end来维护数组的起点和终点,并遵循以下步骤:
- 如果我们已经到达数组的末尾,则停止
- 如果开始大于结束,则增加结束索引
- 从索引开始到结束打印子数组并增加起始索引
下面是上述方法的实现。
C++
// C++ code to print all possible subarrays
// for given array using recursion
#include
# include
using namespace std;
// Recursive function to print all possible subarrays
// for given array
void printSubArrays(vector arr, int start, int end)
{
// Stop if we have reached the end of the array
if (end == arr.size())
return;
// Increment the end point and start from 0
else if (start > end)
printSubArrays(arr, 0, end + 1);
// Print the subarray and increment the starting point
else
{
cout << "[";
for (int i = start; i < end; i++){
cout << arr[i] << ", ";
}
cout << arr[end] << "]" << endl;
printSubArrays(arr, start + 1, end);
}
return;
}
int main()
{
vector arr = {1, 2, 3};
printSubArrays(arr, 0, 0);
return 0;
}
Java
// Java code to print all possible subarrays
// for given array using recursion
class solution
{
// Recursive function to print all possible subarrays
// for given array
static void printSubArrays(int []arr, int start, int end)
{
// Stop if we have reached the end of the array
if (end == arr.length)
return;
// Increment the end point and start from 0
else if (start > end)
printSubArrays(arr, 0, end + 1);
// Print the subarray and increment the starting point
else
{
System.out.print("[");
for (int i = start; i < end; i++){
System.out.print(arr[i]+", ");
}
System.out.println(arr[end]+"]");
printSubArrays(arr, start + 1, end);
}
return;
}
public static void main(String args[])
{
int []arr = {1, 2, 3};
printSubArrays(arr, 0, 0);
}
}
Python3
# Python3 code to print all possible subarrays
# for given array using recursion
# Recursive function to print all possible subarrays
# for given array
def printSubArrays(arr, start, end):
# Stop if we have reached the end of the array
if end == len(arr):
return
# Increment the end point and start from 0
elif start > end:
return printSubArrays(arr, 0, end + 1)
# Print the subarray and increment the starting
# point
else:
print(arr[start:end + 1])
return printSubArrays(arr, start + 1, end)
# Driver code
arr = [1, 2, 3]
printSubArrays(arr, 0, 0)
C#
// C# code to print all possible subarrays
// for given array using recursion
using System;
class GFG
{
// Recursive function to print all
// possible subarrays for given array
static void printSubArrays(int []arr,
int start, int end)
{
// Stop if we have reached
// the end of the array
if (end == arr.Length)
return;
// Increment the end point
// and start from 0
else if (start > end)
printSubArrays(arr, 0, end + 1);
// Print the subarray and
// increment the starting point
else
{
Console.Write("[");
for (int i = start; i < end; i++)
{
Console.Write(arr[i]+", ");
}
Console.WriteLine(arr[end]+"]");
printSubArrays(arr, start + 1, end);
}
return;
}
// Driver code
public static void Main(String []args)
{
int []arr = {1, 2, 3};
printSubArrays(arr, 0, 0);
}
}
// This code is contributed by Rajput-Ji
PHP
$end)
return printSubArrays($arr, 0,
$end + 1);
// Print the subarray and increment
// the starting point
else
{
echo "[";
for($i = $start; $i < $end + 1; $i++)
{
echo $arr[$i];
if($i != $end)
echo ", ";
}
echo "]\n";
return printSubArrays($arr, $start + 1,
$end);
}
}
// Driver code
$arr = array(1, 2, 3);
printSubArrays($arr, 0, 0);
// This code is contributed by mits
?>
输出:
[1]
[1, 2]
[2]
[1, 2, 3]
[2, 3]
[3]
时间复杂度: