初学者不睡觉 发表于 2018-8-18 08:02:52

递归函数

下面这段程序中的递归函数是怎样执行的?求详解
#include <stdio.h>

void f(int x[], int n)
{
        if (n > 1)
        {
                f(&x, n-1);
                printf("%d", x);
        }
        else
                printf("%d", x);
}
int main()
{
        int z = {1, 2, 3, 4, 5, 6};
        f(z, 6);
        printf("\n");
        return 0;
}

音频线 发表于 2018-8-18 09:41:26

在这里,递归函数的第一个参数你可以看做传入的是数组,或者是一个可变长度的参数;
第一步传入的f(z, 6), 其中z是数组名即相当于f(&z, 6);
第二步进入函数6 > 1, 即即进行f(&z, 5), 在这里你可以看做此处传入了将原始z数组去掉第一个元素,以z开头的数组;
依次进行到f(&z, 1)时, 打印数组的首个元素;

我大致列一下过程,希望你能明白:
第一步传入数组为1, 2, 3, 4, 5, 6;
第二步为2, 3, 4, 5, 6;
第三步为3, 4, 5, 6;
第四步为4, 5, 6;
第五步为5, 6;
第六步为6;
然后倒序打印(即递归)上面数组的首元素:
打印6;
打印5;
打印4;
打印3;
打印2;
打印1;

初学者不睡觉 发表于 2018-8-18 10:05:50

音频线 发表于 2018-8-18 09:41
在这里,递归函数的第一个参数你可以看做传入的是数组,或者是一个可变长度的参数;
第一步传入的f(z, 6) ...

在这里你可以看做此处传入了将原始z数组去掉第一个元素,以z开头的数组;
为啥这样呢?

音频线 发表于 2018-8-18 10:49:20

初学者不睡觉 发表于 2018-8-18 10:05
在这里你可以看做此处传入了将原始z数组去掉第一个元素,以z开头的数组;
为啥这样呢?

假如这个函数,不递归,即去掉f(&x, n-1), 那么显然这个函数的功能就是传入一个数组,然后打印首元素;
即便是加上递归,这个函数的本身功能不会变,就是传入一个数组,对首元素进行打印;
那么f(&x, n-1)就是相当于把&x看成了首地址,不就是让1, 2, 3, 4, 5, 6 变成了2, 3, 4, 5, 6;

初学者不睡觉 发表于 2018-8-18 12:23:52

音频线 发表于 2018-8-18 10:49
假如这个函数,不递归,即去掉f(&x, n-1), 那么显然这个函数的功能就是传入一个数组,然后打印首元素 ...

哦哦哦, 理解了, 谢谢
页: [1]
查看完整版本: 递归函数