2.2.3 用递归改变程序状态

现在,我们来写一此更复杂的函数,看看如何使用值。我们实现的函数,是求指定范围内的数字的和。当然你可以直接计算出和,但我们是把它作为使用循环进行计算的示例。(在 2.3.1 节,我们会把代码改成更通用的函数。)

int SumNumbers(int from, int to) {

intres = 0;

for(int i = from; i <= to; i++)

res= res + i;

returnres;

}

这里,我们不能直接用值绑定替换变量,因为每次循环过程中都要修改这个值。程序必须保持一定的状态,其状态在每次循环迭代时改变。这就是说,我们不能像在前面示例中所做的那样,为每次状态改变声明一个新的值;而需要对代码作根本性的改变,使用一种叫“递归(recursion)”的方法,来代替循环:

int SumNumbers(int from, int to) {

if(from > to) return 0;

intsumRest = SumNumbers(from + 1, to);

returnfrom + sumRest;

}

如你所知,递归意味着函数(这里的SumNumbers)调用自身,在这里,是计算 sumRest 变量的值。在这段代码中,我们只用到了值绑定,因此,这是纯函数式的。计算的状态,最初是保存在可变的变量中,现在用递归表示。当我们第一次提到不能为每次状态改变而声明新变量的时候,从某种意义上说,这是不正确的,因为这就是新的递归实现所做的。函数每次递归调用自己,将跳过前面的数,计算其余的数字的和,其结果绑定到变量 sumRest,这就是在每次递归函数执行过程中,声明的新变量。

如何写出每次递归计算的内容是困难的,所以,函数语言提供了一种方法,“隐藏了”递归的困难部分,不需要显式使用递归就能表示大多数问题。在 2.3.1 节,讨论完成函数程序中的计算之后,我们还会回到这个主题。

2.2.3 用递归改变程序状态

时间: 2024-11-06 15:13:40

2.2.3 用递归改变程序状态的相关文章

有用函数编程

<序> 感谢 关于本书 关于封面 第一部分 学习函数式思维 第一章 不同的思维 1.1 什么是函数式编程? 1.2 通往有用函数编程之路 1.3 用函数式编程提高生产力 1.3.1 函数范式 1.3.2 声明式编程风格 1.3.3 了解程序的执行 1.3.4 设计并发友好的应用程序 1.3.5 函数风格怎样形成代码 1.4 函数式编程演示样例 1.4.1 用声明式风格表达意图 1.4.1.1 用 LINQ 处理数据 1.4.1.2 用 XAML 描写叙述用户界面 1.4.1.3 声明式函数动画

Linux命令(14)改变文件和目录权限-chmod&amp;chown

chmod 改变一个文件的权限:chmod [mode] file.txt改变一个目录的权限:chmod [mode] dir改变一个目录和其子目录的权限:    chmod [mode] dir -R mode = 777 or 752 and so on.mode的三个数字,分别表示owner,group,others所具备的权限.1=x 执行2=w 写4=r 读比如owner具有所有权限,1+2+4=7,又比如 group 具有读和执行权限1+4=5. ==================

WPF TreeView递归遍历相关方法

1 /// <summary> 2 /// 递归改变组织树选中状态. 3 /// </summary> 4 /// <param name="org"></param> 5 private void RecursionOrgDataTreeStatus(OrgData org) 6 { 7 foreach (var item in org.Nodes) 8 { 9 item.IsChecked = org.IsChecked; 10 if

Linux 下的权限改变与目录配置

Linux 下的权限改变与目录配置 ./代表本目录的意思. (1):用户与用户组, 1:文件所有者,文件被某一用户所有 2:用户组:    对文件给与一个或者多个用户权限配置 3:其它人: (2):linux用户身份与用户组记录的文件 1:root 相关信息记录到 /etc/passwd中 2:个人密码记录到/etc/shadow中 3:linux所有的组名记录在/etc/group中 (3):linux文件权限概念 :permission deny,无权限的提示 (4):linux 的权限属性

CPSR &amp; SPSR 程序状态寄存器的访问 笔记

CPSR & SPSR 一行短短的汇编触发的学习笔记~ ARM 微处理器支持程序状态寄存器访问指令,用于在程序状态寄存器和通用寄存器之间传递数据.程序状态寄存器(*PSR) 的访问指令包括一下两条: -------------------------------------------------------------------------------------------------------------------------------------------------- 关于M

使用命令chown改变文件、目录的所有权;使用chgrp命令修改文件、目录的组;

使用命令chown改变文件.目录的所有权 超级用户root 或者具有超级用户身份的用户(这里系统的所有者nling 就是一个超级用户),有权利修改文件/目录的所有权,这是Linux 系统所必须确定的.超级用户可以通过使用chown 命令,变更一个文件或一个目录的所有权,这个命令的语法如下: chown newuser file or directory 例如: chown damboo tools.txt 提示:这个命令可以使用户damboo 成为文件tools.txt 的新所有者. 如果超级用

TSql CTE 递归原理探究

CTE是如何进行递归的?产生递归的条件有三个,分别是 初始值 自身调用自身 结束递归的条件 1,示例代码 ;with cte as ( select 1 as id, 1 as jd union all select id +1 as id ,jd+2 as jd from cte where id<10 ) select * from cte 查询结果如下 2,递归过程分析 2.1 初始值 select 1 as id, 1 as jd 提供初始值,CTE中的值只有这一个. 2.2 第一次递归

Linux编程 17 文件权限(权限设置chmod,改变文件属主属组关系chown,chgrp)

一. 概述 如果创建了一个目录或文件,有时会需要改变它的安全性设置,在linux系统上有一些工具可以完成这任务,包括使用chmod命令改变已有默认权限,分别能对属主,属组,其它用户的权限的控制分别以读取.写入.执行3种权限来区分设置,还有使用chown,chgrp来改变默认属主属组关系. 1 . 改变权限 chmod chmod命令用来改变文件和目录安全性设置,该命令的三种用法格式如下: model模式参数可以使用八进制或符号模式进行安全性设置,八进制模式设置非常直观,直接用期望赋予文件的标准3

用js刷题的一些坑

leecode可以用js刷题了,我大js越来越被认可了是吧.但是刷题中会因为忽略js的一些特性掉入坑里.我这里总结一下我掉过的坑. 坑1:js中数组对象是引用对象 js中除了object还有数组对象也是引用对象,这点常常被忽视,所以在递归的时候传递数组要用arr.slice(0)这样复制一个一样的新数组,不然会出现你传入的数组会被同级的递归改变,结果就不对了. 所以只要数组复制的地方最好都要这么写,除非你真的想引用.而且注意是slice不是splice这两个方法差别很大,你如果用splice(0