我在下面提供的框架代码中没有理解LINE 1

时间:2017-11-02 13:54:01

标签: c

void fun(struct node* start)
{
    if(start == NULL)
        return;                    // LINE 1
    printf("%d  ", start->data); 

    if(start->next != NULL )
        fun(start->next->next); 
    printf("%d  ", start->data);
}

返回声明如何工作?我没有得到它的工作!

问题是:

以下函数的输出是什么,用于指向以下链表的第一个节点? 1→2→3→4-将5-→6

2 个答案:

答案 0 :(得分:2)

return语句立即终止该函数;如果startNULL,则该函数不执行任何操作。如果函数总是到达其正文的末尾,则可以按如下方式重写该函数,有些人认为该函数更清晰。

void fun(struct node* start)
{
    if(start != NULL)
    {
        printf("%d  ", start->data); 

        if(start->next != NULL)
            fun(start->next->next); 
        printf("%d  ", start->data);
    }
}

关于输出,请注意start->data的内容是两次打印,即在函数体的开头和结尾。

更准确地说,请考虑以下输入。

1->2->3->4->5->6

第一个调用在结尾处打印1,并在结尾打印结果 跟随之间的递归调用;换行符是为了更好的易读性。

1
[output for the list 3->4->5->6]
1

使用相同的参数在中间扩展调用会产生以下输出。

1
3
[output for the list 5->6]
3
1

同样,可以扩展递归调用。

1
3
5
[output for an empty list]
5
3
1

由于空列表的输出也为空,因此整体输出如下:

1
3
5
5
3
1

答案 1 :(得分:-1)

更具体地说,您正在看到递归函数的基本情况。递归函数通常有两个分支:

1)基本情况(或一组基本情况),函数只返回(通常带有值,有时不返回)。 2)递归情况,如果基本情况包括对函数本身的一个或多个递归调用则执行。

在上面的函数中,基本案例是(start == NULL)。递归案例调用fun(start->next->next);