我試圖找到這個問題的遞回函式,更清楚:
- 輸入 = [8, 4, 3, 4}
- n = 3
- 輸出 = [8, 8, 8, 4, 4, 4, 3, 3, 3, 4, 4, 4]
我已經使用迭代和回圈解決了這個問題,但是由于我剛剛接觸了遞回方法,我仍然特別努力地解決這個問題。這是我的迭代解決方案。
public class repeatElement {
public static void main(String[] args) {
int[] a = {1, 2, 3};
int n, j, i;
n = Integer.parseInt(JOptionPane.showInputDialog("Enter n"));
int[] b = new int[a.length * n];
for (i = 0; i < a.length; i ) {
for (j = n*i; j < n*(i 1); j ) {
if (j % n == 0) {
b[j] = a[i];
}
if (j % n != 0) {
b[j] = a[i];
}
}
}
JOptionPane.showMessageDialog(null, Arrays.toString(b));
}
uj5u.com熱心網友回復:
您可以通過使用額外的index引數來模擬帶有遞回的 for 回圈。在方法結束時,再次遞回呼叫該方法index 1。該方法應該return在index到達陣列末尾時,就像 for 回圈一樣:
private static void repeatEachElement(int times, int[] input, int[] output, int index) {
// stopping condition
if (index == output.length) {
return;
}
// this is where it fills the array.
output[index] = input[index / times];
// calls itself again with index 1
repeatEachElement(times, input, output, index 1);
}
請注意,我在輸出陣列上“回圈”,因此我不需要另一個回圈來填充每個索引。我可以通過執行input[index / times].
要呼叫此方法,您需要先創建一個長度正確的輸出陣列,并且index必須從 0 開始。您可以將此方法包裝成一個更方便的方法:
private static int[] repeatEachElement(int times, int[] input) {
int[] output = new int[input.length * times];
repeatEachElement(times, input, output, 0);
return output;
}
然后你可以這樣做:
int[] input = {8, 4, 3, 4};
System.out.println(Arrays.toString(repeatEachElement(3, input)));
// [8, 8, 8, 4, 4, 4, 3, 3, 3, 4, 4, 4]
不過,歸根結底,除了了解遞回的作業原理之外,在 Java 中遞回地執行此操作并沒有多大意義。它比回圈可讀性差,如果陣列足夠長,它將溢位堆疊。
uj5u.com熱心網友回復:
我可以提供您的問題的解決方案,使用演算法深度優先搜索。
/*
Input = [8, 4, 3, 4],
n = 3,
Output = [8, 8, 8, 4, 4, 4, 3, 3, 3, 4, 4, 4].
*/
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int maximumSize=40;
vector<int> visited(maximumSize, 0);
void showContentVector(vector<int>& input)
{
for(int i=0; i<input.size(); i)
{
cout<<input[i]<<", ";
}
return;
}
void dfs(int current, int previous, vector<int>& input, int number)
{
if(visited[current]==1)
{
return;
}
visited[current]=1;
vector<int> inputCopy;
for(int i=0; i<input.size(); i)
{
inputCopy.push_back(input[i]);
}
int inputCopySize=inputCopy.size();
vector<int> numbers;
for(int i=0; i<number; i)
{
numbers.push_back(input[current]);
}
for(int next=(current 1); next<inputCopySize; next)
{
if(next==previous)
{
continue;
}
dfs(next, current, input, number);
}
for(int i=0; i<numbers.size(); i)
{
input.push_back(numbers[i]);
}
if(current==0)
{
vector<int> temporary;
for(int i=inputCopySize; i<input.size(); i)
{
temporary.push_back(input[i]);
}
reverse(temporary.begin(), temporary.end());
input.clear();
for(int i=0; i<temporary.size(); i)
{
input.push_back(temporary[i]);
}
}
return;
}
int main()
{
vector<int> inputVector={8, 4, 3, 4};
cout<<"inputVector <- ";
showContentVector(inputVector);
cout<<endl;
dfs(0, -1, inputVector, 3);
cout<<"inputVector <- ";
showContentVector(inputVector);
cout<<endl;
return 0;
}
結果如下:
inputVector <- 8, 4, 3, 4,
inputVector <- 8, 8, 8, 4, 4, 4, 3, 3, 3, 4, 4, 4,
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/375099.html
上一篇:遞回函式中的后增量vs 1
下一篇:我如何解決方程上的遞回樹問題
