如何在一个递归函数中向上计数然后向下计数?
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 ArrayListrecArray 是递归函数,以递归方式返回为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;
【讨论】:
以上是关于如何在一个递归函数中向上计数然后向下计数?的主要内容,如果未能解决你的问题,请参考以下文章