gpt4 book ai didi

C:是否可以有一个以函数指针数组作为其参数之一的递归函数?

转载 作者:行者123 更新时间:2023-12-02 09:35:31 25 4
gpt4 key购买 nike

这是更长的版本。 (TL;DR 版本在我的帖子标题中。)

让我们考虑一个递归 quick_sort 函数,当前设置如下:(i) 它接受一个参数 - 一个链接列表,(ii) 它按升序对元素进行排序,并且 (iii) )它返回一个排序的链表。下面的说明性代码(我可以根据要求发布实际代码 - 明显更长)。

#include "list.h"  /*our linked-list implementation which includes definitions
for `concatenate`, which we use below*/

typedef int (*ordinal(int referenceValue, int currentValue));

int smaller(int referenceValue, int currentValue)
{
return currentValue <= referenceValue ? 1 : 0;
}

int larger(int referenceValue, int currentValue)
{
return currentValue > referenceValue ? 1 : 0;
}

List *getElements(List *fullList, ordinal compare) /*let's assume this function exists*/
/*implementation of getElements*/

List* quickSort(List* originalList)
{
/*code to handle the two base cases, i.e., the cases
in which the input list has either 0 or 1 elements */

List *pivotElement = List_create();
List_push(pivotElement, originalList->first->value);

/*we're simply using the first element in the list as the pivot-point*/

List *prePivotElements = quickSort( getElements(originalList, smaller) );
List *postPivotElements = quickSort ( getElements(originalList, larger) );
List *newList = concatenate(prePivotElements, pivotElement, postPivotElements);

return newList;
}

现在假设我们要修改 quick_sort 函数,使其接受两个参数:一个链接列表和一个函数指针数组。这个想法是使用第二个参数(即函数指针数组)来指定排序顺序。函数调用的语法如下所示:quick_sort(linked_list,incrementing[])quick_sort(linked_list,ending[])

我应该提到,我的重点是理解递归传递函数指针数组的可行性/正确语法,而不是算法的效率等。换句话说,让我们尝试忽略可怕的效率/内存-快速排序的特定实现的管理方面:)

为了如上所述修改 quick_sort,我认为以下代码可能有效...

#include "list.h" 

typedef int (*ordinal(int referenceValue, int currentValue));

int smaller(int referenceValue, int currentValue)
{
return currentValue <= referenceValue ? 1 : 0;
}

int larger(int referenceValue, int currentValue)
{
return currentValue > referenceValue ? 1 : 0;
}

/*two new global arrays of function pointers*/
int (*increasing[2]) (int referenceValue, int currentValue) = {smaller, larger};
int (*decreasing[2]) (int referenceValue, int currentValue) = {larger, smaller};

List *getElements(List *fullList, ordinal compare)
/*implementation of getElements*/

/*updated argument list*/
List* quickSort(List* originalList, ordinal compare[])
{
/*base cases*/
List *pivotElement = List_create();
List_push(pivotElement, originalList->first->value);

/*updated recursive function call*/
List *prePivotElements =
quickSort( getElements(originalList, compare[0]), compare );
List *postPivotElements =
quickSort ( getElements(originalList, compare[1]), compare );
List *newList = concatenate(prePivotElements, pivotElement, postPivotElements);

return newList;
}

...但它会导致以下错误:

error: declaration of ‘compare’ as array of functions
List* quickSort(List* originalList, ordinal compare[])
^
error: type of formal parameter 2 is incomplete
List *prePivotElements = quickSort( getElements(originalList, compare[0]), compare );
^
error: type of formal parameter 2 is incomplete
List *postPivotElements = quickSort ( getElements(originalList, compare[1]), compare );
^

回顾一下我的问题:C 是否允许我们将函数指针数组传递给其他函数?如果递归地这样做呢?如果允许,正确的语法是什么?

请原谅帖子的长度,我相信你们中的一位退伍军人会更加简洁!

(关于所有发布的代码必须编译的SO规则:我认为在这种情况下坚持概念上相关的代码是有意义的。但是,如果人们愿意,我可以发布完整的代码.c 文件和 .h 文件。)

更新:根据此处的要求,提供了 quick_sort 工作版本的相关文件。我还包含了 shell 输出,包括用于编译/链接的命令。仅供引用,代码板给出了一些没有任何意义的奇怪错误(例如,在具有正确/可编译函数头的行上,它声称我缺少括号):

最佳答案

typedef int (*ordinal(int referenceValue, int currentValue));

不正确。它在语法上是有效的,但括号没有任何作用,它只是定义了一个函数类型而不是指向函数的指针。 typedef 函数指针的正确方法是

typedef int (*ordinal)(int, int);

这是标识符周围的括号和*(与参数名称无关)。

使用该 typedef 来声明函数数组会更好,而不是重复定义。

ordinal increasing[2] = {smaller, larger};

关于C:是否可以有一个以函数指针数组作为其参数之一的递归函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26711703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com