我想提出一个递归函数,它将非负整数n作为输入,并生成从0到n然后再次降为0的所有自然数的列表
例如,如果函数名为
ArrayList<Integer> f(int x)
当 x = 4 时给出一个列表
{0,1,2,3,4,3,2,1,0}
如何实现这一目标?这可以在一个函数中完成,而不需要辅助函数,如countup和countdown。
逻辑通缉!
帮助感谢!
答案 0 :(得分:2)
这是我的解决方案:
public ArrayList<Integer> f(int x) {
ArrayList<Integer> arr;
if (x == 1) {
arr = new ArrayList<Integer>();
arr.add(0);
arr.add(1);
arr.add(0);
} else {
arr = f(x-1);
int pos = (int) (arr.size() / 2)+1;
arr.add(pos, x);
arr.add(pos + 1, x-1);
}
return arr;
}
在此算法中,我将x的基值设置为1,其中生成的数字应为[0,1,0]。
如果x大于1,则递归以生成x-1的列表,然后在返回列表的适当位置插入两个值x和x-1,这些位置基本上位于中间位置旁边值。
例如
如果x等于2;
得到1的值 - 这将是[0,1,0]
然后在第三个位置(中间位置)插入2和1,得到[0,1,2,1,0]
如果x等于3;
得到2的值 - 这将是[0,1,2,1,0]
然后在第四个位置插入3和2以得到[0,1,2,3,2,1,0]
等...
答案 1 :(得分:0)
recArray是递归函数,以递归方式作为arraylist返回。
int x=10;
List<Integer> result=null;
result=recArray(x,result);
如果迭代结果数组列表,它将具有您所说的数字
public List<Integer> recArray(Integer x, List<Integer> result) {
if (result == null) {
result = new ArrayList<Integer>();
for (int i = 0; i < 2 * x + 1; i++) {
result.add(0);
}
result.set(x, x);
}
int pos = result.size() / 2;
result.set(pos - x, pos - x);
result.set(pos + x, pos - x);
if (x == 0) {
return result;
}
return recArray(x - 1, result);
}
谢谢, Arumugarani
答案 2 :(得分:0)
您可以这样做:
ArrayList<Integer> f(int x) {
if (x==0) {
ArrayList<Integer> res = new ArrayList<>();
res.add(0);
return res;
}
ArrayList<Integer> t = f(x-1);
t.add(t.size()/2, x-1);
t.add(t.size()/2, x);
return t;
}