在第1.2节中。在经典的文本结构和计算机程序的解释中,有一个例子说明了如何计算将一笔钱分成更小面额的方法的数量。以下是他们写的语言:
想出迭代斐波那契算法只需要一点小聪明。相比之下,考虑以下问题:我们可以用多少种不同的方法来找1美元的零钱,给0.5美元、25美分、10美分、5美分和1美分?更一般地说,我们可以写一个过程来计算改变任何给定金额的方式的数量吗?
这个问题有一个简单的递归过程解决方案。假设我们认为可用的硬币类型是按某种顺序排列的。那么以下关系成立:
使用n种硬币改变数量的方法数量等于。。。
...除第一种硬币外,使用其他硬币更改金额a的方法的数量,加上更改金额a的方法的数量− d使用所有n种硬币,其中d是第一种硬币的面额。
要了解为什么这是真的,可以观察到改变的方法可以分为两组:不使用任何第一种硬币的方法和使用第一种硬币的方法。因此,对某一金额进行更改的方式总数等于不使用任何第一种硬币的情况下对该金额进行更改的方式数,加上假设我们使用第一种硬币的情况下进行更改的方式数。但后一个数字等于使用第一种硬币后剩余金额的兑换方法的数量。
我的问题是关于最后一个陈述。我们谈论的是一美元(尽管他们后来建议尝试用更小的金额来解决这个问题,比如10美分)——为什么打破一美元的方法总是等于打破剩余金额的方法数量从一美元中取出一个面额的硬币(即一美元减去单个硬币的数量)后?
假设我们有各种方法可以兑换美元,我们可以选择任何面额,比如四分之一(25美分)。我们可以通过解决方案将它们分为使用四分之一和不使用四分之一:
"1美元的所有解决方案"="使用四分之一的1美元解决方案""不使用四分之一的1美元解决方案"
作者声称“使用四分之一的1美元的所有解决方案”与“75c的所有解决方案”大小相同。你可以直观地看到这是真的。形式上你可以说:
a) “使用四分之一的1美元解决方案”
b)"75c的所有解决方案"
因此,它们必须大小相同,即:
Size of "solutions for $1 that use a quater"
= Size of "all solutions for 75c"
因此:
Size of "All solutions for $1" =
Size of "solutions for $1 that use a quater"
+ Size of "solutions for $1 that don't use a quater"
可以重写为:
Size of "All solutions" =
Size of "all solutions for 75c"
+ Size of "solutions for $1 that don't use a quater"
在Abelson/Sussman的经典文本《计算机程序的结构和解释》中,在第1.2.2节关于树递归和斐波那契序列的内容中,他们展示了以下图像: 计算第五个斐波那契数时生成的树递归过程 然后他们写道:“请注意,整个计算过程(fib 3)-几乎一半的工作-都是重复的。事实上,不难证明程序将计算的次数(fib 1)或(fib 0)(通常,上述树中的叶子数)正是fib(n 1)。” 我知道他们正在强调树递
在第二章中,我们引入了偶对的概念,作为一种将两个对象结合为一个对象的机制。我们展示了偶对可以使用内建元素来实现。偶对的封闭性表明偶对的每个元素本身都可以为偶对。 这种封闭性允许我们实现递归列表的数据抽象,它是我们的第一种序列类型。递归列表可以使用递归函数最为自然地操作,就像它们的名称和结构表示的那样。在这一节中,我们会讨论操作递归列表和其它递归结构的自定义的函数。 递归列表结构将列表表示为首个元素
程序员必须总是留意程序中可能出现的错误。例子数不胜数:一个函数可能不会收到它预期的信息,必需的资源可能会丢失,或者网络上的连接可能丢失。在设计系统时,程序员必须预料到可能产生的异常情况并且采取适当地措施来处理它们。 处理程序中的错误没有单一的正确方式。为提供一些持久性服务而设计的程序,例如 Web 服务器 应该对错误健壮,将它们记录到日志中为之后考虑,而且在尽可能长的时间内继续接受新的请求。另一方
这一章专注于编程的第三个基本元素:程序自身。Python 程序只是文本的集合。只有通过解释过程,我们才可以基于文本执行任何有意义的计算。类似 Python 的编程语言很实用,因为我们可以定义解释器,它是一个执行 Python 求值和执行过程的程序。把它看做编程中最基本的概念并不夸张。解释器只是另一个程序,它确定编程语言中表达式的意义。 接受这一概念,需要改变我们自己作为程序员的印象。我们需要将自己
汇编语言是直面计算机的编程语言,因此理解计算机结构是掌握汇编语言的前提。当前流行的计算机基本采用的是冯·诺伊曼计算机体系结构(在某些特殊领域还有哈佛体系架构)。冯·诺依曼结构也称为普林斯顿结构,采用的是一种将程序指令和数据存储在一起的存储结构。冯·诺伊曼计算机中的指令和数据存储器其实指的是计算机中的内存,然后在配合CPU处理器就组成了一个最简单的计算机了。 汇编语言其实是一种非常简单的编程语言,因
我试图通过记忆来解决“计数变化”的问题。 考虑下面的问题:我们可以用多少种不同的方式来换取1美元,半价、四分之一、二分硬币、五分硬币和五分硬币?更一般地说,我们可以编写一个函数来计算使用任何一组货币面额改变任何给定金额的方法的数量吗? 以及递归的直观解决方案。 使用n种硬币改变a的数量的方法数 除第一种硬币外,其他所有硬币都可以换成硬币的方法,加上 使用所有n种硬币改变较小数量a-d的方法的数量,