1)
下面是一个python函数summation
,它可以执行立方体/平方/.的和,类似的操作。
def identity(k):
return k
def cube(k):
return pow(k, 3)
def square(k):
return pow(k,2)
def summation(n, term):
if n == 0:
return 0
else:
return term(n) + summation(n-1, term)
def sum_cubes(n):
return summation(n, cube)
if __name__ == '__main__':
sum = sum_cubes(4)
print(sum)
""" In C, We can implement the same using function pointers. Goal is, to
perform similar operations(Sum of ..) using single function summation()"""
2)
考虑一下,下面是C中的api排序,
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
在这里,qsort
可以对目录/字符串/.中的任何类型的数据、浮点数/文件名数组进行排序。
问题:
如何定义泛型函数?
summation
是泛型函数吗?
或
qsort
是泛型函数吗?
或
给出两个例子,泛型函数是一个无效的术语吗?
注:动机-对术语qsort
或任何类型的函数,我设计。
发布于 2016-12-17 18:26:55
“泛型”有几个含义。
在日常语言中,“通用”共享公共属性,但在某些方面不那么具体。
在这个透视图下,您可以认为qsort()
是通用的:该函数的代码能够对任何固定大小的数据结构进行排序,您可以使用QSORT算法为其定义比较函数。
同样的情况也适用于您的summation()
函数,它总结了使用任何带有一个参数的函数获得的术语。
像C++或Java这样的编程语言允许使用模板或泛型进行通用编程:
C++14标准中的定义:模板定义了一个类或函数系列,或者定义了一个类型族的别名。
原则是,类或函数的实现可以按类型进行参数化。
根据这一更为正式的观点,qsort()
不是泛型函数。它的实现不需要在编译时确定任何类型,而且它的行为与类型无关。它唯一需要的是要排序的元素的大小,这个大小是一个在运行时处理的普通参数。
对于非静态类型的语言,如Python,我不知道该为summation()
回答什么。我认为它不是泛型的,因为它的实现和它的行为不依赖于类型:这个函数只是一个高阶函数,参数term
是一个函数。它不使用任何基于类型改变此函数行为的特性。
为了说明一个泛型函数,您可以查看C++标准函数std::sort()
:它的实现取决于其参数的类型(还有一个可选的比较函数与已确定类型的参数)。通过使用C++模板的特性,它可以在具有泛型函数实现所需的运算符/成员函数/特征/迭代器的条件下,对任何类型的容器进行排序。
吗
与静态类型化语言相比,动态类型化语言需要更少的泛型代码。
例如,如果您有一个动态类型对象的容器,那么qsort函数可以对容器进行一般排序,只要可以比较容器中两个元素的任何组合。
但即使在如此灵活的环境中,泛型依赖式编程也会有所帮助。典型的用例是多方法,其中行为或代码取决于参数的类型,甚至取决于类型的组合(例如确定两个不同形状之间的交集)。有关更多信息,请参见:
发布于 2016-12-17 17:31:17
泛型函数在编译时一般采用至少一个函数参数的类型。也就是说,编译器会找出在某个地方使用哪种类型,并在函数中使用这种类型。例如,如果您的函数中有一个与+
运算符一起使用的泛型参数,则该类型必须有适当的方法。对于字符串/数组,在许多情况下,这将是一个连接,对于和整数/浮点数是一个加法。编译器可以检测到应用正确的操作。从这个意义上说,C例程不是通用的,因为应用某些大小信息的是程序员,而不是检测类型和使用正确大小的编译器。
例如用某种虚构的语言
func add(p1,p2) {
return p1+p2
}
print add("a", "b") // yields "ab"
print add(1, 2) // yields 3
在这里,编译器检测到在第一种情况下应用了两个字符串,并在内部展开如下
func add(p1:string, p2:string)
并将+
视为级联,而在第二种情况下,它将扩展。
func add(p1:int, p2:int)
根据提供的整数参数。泛指编译器在编译期间生成单个代码。例如,Python是非类型化的,并且会在运行时执行这种替换。意思: Python没有泛型函数,因为所有东西都是泛型的。
https://softwareengineering.stackexchange.com/questions/338339
复制相似问题