Algorithm 你能帮我避免使用递归吗,因为它会导致堆栈溢出
我对使用递归的函数有一个问题。要解释它有点困难,也有点长,所以我将试着只写要点,并给出一些伪代码。希望这是可以理解的 假设我有一个数字数组-正数应该加到给定的数字上,而如果有负数,它们的绝对值告诉我们从数组的哪个位置开始加下一个正数Algorithm 你能帮我避免使用递归吗,因为它会导致堆栈溢出,algorithm,recursion,Algorithm,Recursion,我对使用递归的函数有一个问题。要解释它有点困难,也有点长,所以我将试着只写要点,并给出一些伪代码。希望这是可以理解的 假设我有一个数字数组-正数应该加到给定的数字上,而如果有负数,它们的绝对值告诉我们从数组的哪个位置开始加下一个正数 Example: The given number is 5. array = [1, 2, -3, 5, 7, 8, 9] 0 1 2 3 4 5 6 <------- positions 示例: 给定的数字是5。
Example:
The given number is 5.
array = [1, 2, -3, 5, 7, 8, 9]
0 1 2 3 4 5 6 <------- positions
示例:
给定的数字是5。
数组=[1,2,-3,5,7,8,9]
01 2 3 4 5 6你不能直接使用循环吗
for (sum=i=0;i<array_length;) {
if (array[i]<0) i=-array[i];
else sum += array[i++];
}
for(sum=i=0;i我想这能奏效吗
private long Sum(int[] array)
{
long result = 0;
int index = 0;
while (index < array.Length)
{
int val = array[index];
if (val < 0)
{
index = Math.Abs(val);
}
else
{
result += array[index++];
}
}
return result;
}
专用长和(int[]数组)
{
长结果=0;
int指数=0;
while(索引<数组长度)
{
int val=数组[索引];
if(val<0)
{
指数=Math.Abs(val);
}
其他的
{
结果+=数组[index++];
}
}
返回结果;
}
i=0
a=[1,2,-3,5,7,8,9]
总和=0
而(i=0
总和+=a[i]
我++
其他的
i=abs(a[i])
}
也许是这样的
sum(array, s) // s is the initial sum value
{
for i = 0 to last array index
{
if (array[i] < 0)
{
for j = -array[i] to last array index
{
s += array[j]
}
return s
}
s += array[i]
}
}
sum(数组,s)//s是初始和值
{
对于i=0到最后一个数组索引
{
if(数组[i]<0)
{
对于j=-array[i]到最后一个数组索引
{
s+=数组[j]
}
返回s
}
s+=数组[i]
}
}
嗯…我不知道你从哪里得到了5+3+29
来自…?你确定它不是返回数字+和(数组[abs(元素)到结尾])
?不,我也不觉得他好像数了5两次….,5+f([1,2,-3,5,7,8,9]如果您的语言支持,您可以使用累加器确保您的函数是尾部递归的。“这里我有一些其他操作,保存一些状态”-这种情况下,最好给出一个实际的示例,而不是模糊的描述。此外,任何递归都可以(通常相当容易)通过使用堆栈数据结构转换为迭代。他从来没有说过什么语言,有些语言不允许您更改循环变量?我想这就是工作,但函数开头有一些操作,如果从新位置开始求和,我必须重复这些操作。有什么想法吗:我不明白,抱歉。W您必须重复哪些操作?对于数组中的每个元素,从第一个到最后一个{//这里我有一些其他操作,保存一些状态
@Faery在if()
语句之前,其他操作不能进入循环的顶部吗?哎呀!我真是个傻瓜
i=0
a = [1,2,-3,5,7,8,9]
sum = 0
while (i < a.count)
{
if a[i] >= 0
sum += a[i]
i++
else
i = abs(a[i])
}
sum(array, s) // s is the initial sum value
{
for i = 0 to last array index
{
if (array[i] < 0)
{
for j = -array[i] to last array index
{
s += array[j]
}
return s
}
s += array[i]
}
}