首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >属函数的定义

属函数的定义
EN

Software Engineering用户
提问于 2016-12-17 17:13:38
回答 2查看 1.3K关注 0票数 0

1)

下面是一个python函数summation,它可以执行立方体/平方/.的和,类似的操作。

代码语言:javascript
运行
复制
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排序,

代码语言:javascript
运行
复制
void qsort(void *base, size_t nmemb, size_t size,
                            int (*compar)(const void *, const void *));

在这里,qsort可以对目录/字符串/.中的任何类型的数据、浮点数/文件名数组进行排序。

问题:

如何定义泛型函数?

summation是泛型函数吗?

qsort是泛型函数吗?

给出两个例子,泛型函数是一个无效的术语吗?

注:动机-对术语qsort或任何类型的函数,我设计。

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2016-12-17 18:26:55

“泛型”有几个含义。

非正式定义

在日常语言中,“通用”共享公共属性,但在某些方面不那么具体。

在这个透视图下,您可以认为qsort()是通用的:该函数的代码能够对任何固定大小的数据结构进行排序,您可以使用QSORT算法为其定义比较函数。

同样的情况也适用于您的summation()函数,它总结了使用任何带有一个参数的函数获得的术语。

形式定义

像C++或Java这样的编程语言允许使用模板或泛型进行通用编程:

C++14标准中的定义:模板定义了一个类或函数系列,或者定义了一个类型族的别名。

原则是,类或函数的实现可以按类型进行参数化。

根据这一更为正式的观点,qsort()不是泛型函数。它的实现不需要在编译时确定任何类型,而且它的行为与类型无关。它唯一需要的是要排序的元素的大小,这个大小是一个在运行时处理的普通参数。

对于非静态类型的语言,如Python,我不知道该为summation()回答什么。我认为它不是泛型的,因为它的实现和它的行为不依赖于类型:这个函数只是一个高阶函数,参数term是一个函数。它不使用任何基于类型改变此函数行为的特性。

为了说明一个泛型函数,您可以查看C++标准函数std::sort():它的实现取决于其参数的类型(还有一个可选的比较函数与已确定类型的参数)。通过使用C++模板的特性,它可以在具有泛型函数实现所需的运算符/成员函数/特征/迭代器的条件下,对任何类型的容器进行排序。

可以动态类型化语言具有泛型函数

与静态类型化语言相比,动态类型化语言需要更少的泛型代码。

例如,如果您有一个动态类型对象的容器,那么qsort函数可以对容器进行一般排序,只要可以比较容器中两个元素的任何组合。

但即使在如此灵活的环境中,泛型依赖式编程也会有所帮助。典型的用例是多方法,其中行为或代码取决于参数的类型,甚至取决于类型的组合(例如确定两个不同形状之间的交集)。有关更多信息,请参见:

票数 1
EN

Software Engineering用户

发布于 2016-12-17 17:31:17

泛型函数在编译时一般采用至少一个函数参数的类型。也就是说,编译器会找出在某个地方使用哪种类型,并在函数中使用这种类型。例如,如果您的函数中有一个与+运算符一起使用的泛型参数,则该类型必须有适当的方法。对于字符串/数组,在许多情况下,这将是一个连接,对于和整数/浮点数是一个加法。编译器可以检测到应用正确的操作。从这个意义上说,C例程不是通用的,因为应用某些大小信息的是程序员,而不是检测类型和使用正确大小的编译器。

例如用某种虚构的语言

代码语言:javascript
运行
复制
func add(p1,p2) {
  return p1+p2
}

print add("a", "b") // yields "ab"
print add(1, 2) // yields 3

在这里,编译器检测到在第一种情况下应用了两个字符串,并在内部展开如下

代码语言:javascript
运行
复制
func add(p1:string, p2:string) 

并将+视为级联,而在第二种情况下,它将扩展。

代码语言:javascript
运行
复制
func add(p1:int, p2:int)

根据提供的整数参数。泛指编译器在编译期间生成单个代码。例如,Python是非类型化的,并且会在运行时执行这种替换。意思: Python没有泛型函数,因为所有东西都是泛型的。

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/338339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档