关于递归函数的问题?

ipk*_*iss 3 c recursion

我有一本C书的递归函数如下:

void print(int a[], int n)
{   if (n<=0)  return ;
     printf("%d\n", a[0]);
     print(&a[1], n-1);
}
Run Code Online (Sandbox Code Playgroud)

我运行了,这个函数打印指定数组的所有元素.但我真的不明白这个功能是如何工作的,所以我可以打印数组的所有元素.请问有人能给我一个明确的解释吗?

Pét*_*rök 5

&a[1]是数组的第二个元素的地址,它实际上是第一个元素之后的数组部分的地址.所以在打印参数数组的第一个元素后,

print(&a[1], n-1);
Run Code Online (Sandbox Code Playgroud)

自己传递数组的剩余部分,也将长度减少一个.

例如,如果你调用print与阵列{1, 2, 3, 4, 5}n == 5,事件和调用链如下:

  1. 打印第一个元素(1)
  2. 用数组的剩余部分调用自己,即{2, 3, 4, 5}n == 4
    1. 打印第一个元素(2)
    2. 用数组的剩余部分调用自己,即{3, 4, 5}n == 3
      1. 打印第一个元素(3)
      2. 用数组的剩余部分调用自己,即{4, 5}n == 2
        1. 打印第一个元素(4)
        2. 用数组的剩余部分调用自己,即{5}n == 1
          1. 打印第一个元素(5)
          2. 用数组的剩余部分调用自己,即{}n == 0
            1. n<=0 - >退货
          3. 返回
        3. 返回
      3. 返回
    3. 返回
  3. 返回

  • 如果用'1代替&[1]可能会更容易理解 - 它们的意思相同. (4认同)