如何在一个递归函数中向上计数然后向下计数?

时间:2014-11-24 20:03:06

标签: java function recursion logic

我想提出一个递归函数,它将非负整数n作为输入,并生成从0到n然后再次降为0的所有自然数的列表

例如,如果函数名为

ArrayList<Integer> f(int x)

x = 4 时给出一个列表

  

{0,1,2,3,4,3,2,1,0}


如何实现这一目标?这可以在一个函数中完成,而不需要辅助函数,如countup和countdown。
逻辑通缉!
帮助感谢!

3 个答案:

答案 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;
}