该程序用于打印作为输入参数给出的数组中所有数字的总和。然而,这不会发生。请让我知道错误是什么,并向我提供解释的解决方案。
// Route group
$router->group(['middleware' => 'auth'], function() {
//Web Directory
Route::get('web-directory','WebDirectoryController@index');
}
答案 0 :(得分:0)
你的问题的标题是“如何避免递归中的返回语句”,这正是你应该做的,而不是在递归场景中避免。
但这不是你的代码唯一的问题,因为它没有像你所描述的那样做。
正如评论中已经提到的,这不是需要(或建议使用)递归方法的东西。它可以完成,但效率很低,如果你有一个大的输入数组(它需要为c#中的每个递归方法调用一个新的堆栈帧),可能会导致堆栈溢出。
要以递归方式解决此问题,您需要在开始尝试对其进行编码之前尝试将问题说明为递归问题。在伪代码中,对于大小为x
的输入数组n
:
array_sum(x):
if (x is empty)
return 0;
else
return x[0] + array_sum(x[1:n-1])
C#中的实现会尝试避免分配新的数组实例(而不是问题代码中的某个非功能部分正在做什么),而是跟踪输入数组中的起始索引:
public static array_sum(int startIndex, int[] x)
{
// ...
}
答案 1 :(得分:0)
假设您需要使用递归作为练习,我将不再对此进行评论。
你的程序不起作用的原因似乎是当数组只有一个元素时,你不要在返回之前将该元素添加到小计(你称之为x
)。
虽然递归有些昂贵,但你的程序大致使用½arr.Length²int
s,如果你将它应用到长度为500,000的数组,这将需要1TB的内存!所以你最好不要复制数组。
答案 2 :(得分:0)
如果你想知道没有递归的答案,你只需在对数字进行求和时迭代它。
如果您想制作递归解决方案,return
是必不可少的。没有它,递归只是制作for循环的一种不同方式。
public static int sumOfElements(int[] arr, int currentIndex, int accumulator)
{
if( finished-expression )
return accumulator;
else
return sumOfElements(...);
}
public static int sumOfElements(int[] arr)
{
return sumOfelements(arr, 0, 0);
}
你的错误是x
在每次迭代时都是不同的。您不会使用递归中返回的值,因此您可以将一个元素的总和作为结果。
答案 3 :(得分:0)
同意先前关于递归,低效率和复杂性的评论,但下面的练习是使代码工作的最小数量更改。
的变化:
代码:
namespace linkedLists
{
class Program
{
static void Main(string[] args)
{
int[] arr = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int x = sumOfNum(arr, 0);
Console.WriteLine(x);
Console.ReadLine();
}
public static int sumOfNum(int[] arr, int x)
{
if (arr.Length == 0) return x; // Change #1
int[] arr_new = new int[arr.Length - 1];
x += arr[arr.Length - 1]; // Change #2
if (arr.Length > 1)
{
for (int i = 0; i < arr.Length - 1; i++)
{
arr_new[i] = arr[i];
}
}
if (arr.Length > 1)
{
return sumOfNum(arr_new, x); // Change #3
}
return x;
}
}
}