17 函数 您所在的位置:网站首页 r语言中points函数 17 函数

17 函数

2023-09-17 03:29| 来源: 网络整理| 查看: 265

17 函数 17.1 函数基础 17.1.1 介绍

在现代的编程语言中使用自定义函数, 优点是代码复用、模块化设计。

如果一段程序需要在多处使用, 就应该将其写成一个函数, 然后在多处调用。 需要修改程序执行功能时, 仅需要修改函数而不需要修改各处调用。 如果不使用函数而是将相同的代码在多处复制粘贴, 修改时就需要修改多处, 很容易漏掉一处。

在编程时, 把编程任务分解成小的模块,每个模块用一个函数实现, 便于理解每个模块的作用, 降低了程序复杂性, 使得程序容易管理。

函数的自变量是只读的, 函数中定义的局部变量只在函数运行时起作用, 不会与外部或其它函数中同名变量混杂, 所以使用函数还减少在很长的程序中变量互相混淆出错的危险。

函数返回一个对象作为输出, 如果需要返回多个变量, 可以用列表进行包装。

17.1.2 函数定义

函数定义使用function关键字,一般格式为

函数名 sum()

管道运算在表示对一个输入使用多个步骤逐次进行处理时, 如果每一个步骤都是函数调用, 就比较方便编程也容易理解。 但是,如果中间某一步没有现成的函数, 就要写成无名函数格式, 程序会显得略为晦涩难懂。

比如,这样的步骤:

x (\(x) c(0, x))() ## [1] 0 0 1 1 0 17.1.5 递归调用

在函数内调用自己叫做递归调用。 递归调用可以使得许多程序变得简单, 但是往往导致程序效率很低, 需谨慎使用。

R中在递归调用时, 最好用 Recall 代表调用自身, 这样保证函数即使被改名(在R中函数是一个对象, 改名后仍然有效)递归调用仍指向原来定义。

斐波那契数列是如下递推定义的数列: \[ \begin{aligned} & x_0 = 0, \quad x_1 = 1 \\ & x_n = x_{n-2} + x_{n-1} \end{aligned} \] 这个数列可以用如下递归程序自然地实现:

fib1 =2 ) { return(Recall(n-1) + Recall(n-2)) } } for(i in 0:10) cat("i =", i, " x[i] =", fib1(i), "\n") ## i = 0 x[i] = 0 ## i = 1 x[i] = 1 ## i = 2 x[i] = 1 ## i = 3 x[i] = 2 ## i = 4 x[i] = 3 ## i = 5 x[i] = 5 ## i = 6 x[i] = 8 ## i = 7 x[i] = 13 ## i = 8 x[i] = 21 ## i = 9 x[i] = 34 ## i = 10 x[i] = 55 17.1.6 向量化

自定义的函数,如果其中的计算都是向量化的, 那么函数自动地可以接受向量作为输入,结果输出向量。 比如,将每个元素都变成原来的平方的函数:

f 1 \end{cases} \]

其一元函数版本可以写成

g cat("函数运行完毕后:x=", x, "\n") ## Error in cat("函数运行完毕后:x=", x, "\n") : object "x" not found

再比如, 下面的函数试图知道自己被调用了多少次, 但是因为每次函数调用完毕局部变量就消失, 再次调用时的局部变量已经对应到全新的存储空间, 所以如下的程序不能达到目的:

f


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有