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

Posted

技术标签:

【中文标题】如何在一个递归函数中向上计数然后向下计数?【英文标题】:how to count up then down in one Recursion function? 【发布时间】:2015-01-22 15:47:26 【问题描述】:

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

例如,如果函数被命名

ArrayList<Integer> f(int x)

;当 x = 4 它给出一个包含的列表

0,1,2,3,4,3,2,1,0

如何做到这一点??可以在一个函数中完成,而无需诸如 countup 和 countdown 之类的辅助函数。 逻辑通缉! 帮助赞赏!

【问题讨论】:

假设你有一个函数,它产生一个从 1 到 n 再到 1 的自然数列表。您将如何在生成从 0 开始和结束的列表的函数中使用它? @Becojo 不是做作业的人 您的递归有 3 个边缘情况:1) 当您开始时,2) 当您的号码达到 n 3) 当您回到起点时。深思熟虑,这很容易。 @mostruash 但是如果不允许全局变量检测到它何时命中 n 怎么办? 【参考方案1】:

这是我的解决方案:

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]

等等……

【讨论】:

将分配推送到边缘案例 已编辑:将分配 arr = new ArrayList() 推送到边缘情况。【参考方案2】:

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);


谢谢, 阿鲁穆加拉尼

【讨论】:

【参考方案3】:

你可以这样做:

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;

【讨论】:

以上是关于如何在一个递归函数中向上计数然后向下计数?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript:递归计数基本案例

如何计算fibonacci函数的递归调用次数

如何在函数的 N 次递归调用中中断程序?

php递归数组计数

没有递归的 C# 计数项目

python函数 | 递归函数