如何避免递归中的return语句

时间:2015-05-31 16:47:43

标签: arrays algorithm recursion c#-3.0

该程序用于打印作为输入参数给出的数组中所有数字的总和。然而,这不会发生。请让我知道错误是什么,并向我提供解释的解决方案。

// Route group
$router->group(['middleware' => 'auth'], function() {

    //Web Directory
    Route::get('web-directory','WebDirectoryController@index');
}

4 个答案:

答案 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)

同意先前关于递归,低效率和复杂性的评论,但下面的练习是使代码工作的最小数量更改。

的变化:

  1. 添加了数组大小保护
  2. 移出了if-block
  3. 的总和
  4. 添加了退货声明
  5. 代码:

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