大家好,我去世了,我是Liang Tang。这篇文章在公共帐户中开始:
今天,我们继续研究伯克利CS61A的作业4。本课程中没有很多新内容。主要的解释是编程习惯的分层设计和实施。质量很高。建议每个人都听它。
原始描述
github
这次,作业仍然很高,难度略有下降,这比上一部作业3更简单。
好吧,不要说太多胡说八道,让我们看看这些问题。
曼哈顿距离也称为出租车距离。在两个维平面中,我们通常使用(x,y)表示坐标。曼哈顿距离是计算两个坐标之间距离的一种方式。x_1 -x_2 |+ |y_1 -y_2 |$。
据说这种计算方法在美国的曼哈顿地区的地址中陈述,通常以曼哈顿地点的街道和大道表示。第46街和第七大道。如果将街道和大道视为坐标轴中的两个轴,则时代广场的坐标为(46、7)。
实现此问题的方法称为计算两个坐标的曼哈顿距离。
标题本身并不困难,主要的培养是我们的分层设计概念。在这个问题中,在功能中输入的参数是两个。并且给出了计算相应总和的代码。因此,我们要做的就是称呼这些总和方法,获得的坐标,并计算遵循曼哈顿距离的方式。
给定整数序列,然后返回完整平方数的完整平方根。
标题表明,我们可以使用功能来制作四个房屋:
该方法非常简单。打开每个根号后,比较正方形和原始数字。如果相同,则意味着该数字是一个完整的平方数,并且答案包含在统计信息中。
假设G是一个数学函数,其计算遵循以下计算逻辑:
现在,我们需要使用递归和不可用的递归来实现G函数。
递归版本很简单。基本条件是,当n大于3时,递归调用。
迭代方法相似。我们可以使用变量来维护$ g {n-1},g {n-2},g_ {n-3} $,并每次公式计算$ gn $。},g {n-2},g {n-3} $在$ g {n-3} = g {n-2}的权利中g_ {n-1} = g_n $
ping -pong序列是一系列上升和下降的序列:
对于KE元素(k从1开始),如果它包含许多数字7或7,则调整其举重顺序。因此,我们可以看到7、14、17、21、27、27,27,28在上面的序列中变化。
现在将实现一个函数,在ping -pong序列中返回NN元素,并且不能用于使用任何分配语句。您可以使用定义功能。
操作中提供了工具功能,以确定数字是否包含7。
实际上,pingpong序列的逻辑并不复杂。我们很容易通过周期计算答案,但是标题要求我们不能使用分配语句,这意味着我们无法存储中间结果。为我们存储中间结果。
我们可以轻松地编写结构:
也就是说,序列的先前数量加上这次的变化量,我们具有该功能,但尚无。因此,我们还需要实现该功能,并且该功能也可以使用类似的想法:
通过观察,您可以发现,当序列号少于7时,每个更改的数量为1,然后每次遇到过渡量乘以-1时,它保持不变而不转动,这等同于乘以乘以1。
当我们将这两个代码组合在一起时,我们会得到答案:
有一台机器可以用2个功率吐出硬币,例如1分,2分,4分,8分...
现在给出一个整数,机器吐出了多少可能的可能性?
例如,有6种可能性:
简单地看这个问题,实际上并不低。但是,此任务给出了一个提示,您可以参考上一个问题。
以前有类似的问题,并给出了两个整数N和M。需要将n分为几个组合,不超过整数。
例如,当n = 6,m = 4时,有9种可能性:
这是如何实现的?
每次分手时,我们都有两个选择。分裂的结果是M,一个不存在。如果我们认为M是一种策略,则使用此策略,而不是使用这种策略。
使用此策略,将n减少,m,因为m可以随时使用。如果您不使用M的策略,则会跳过和判断策略M-1,也就是说,我们正在从中选择一种假设的策略大到很小。可以避免这种操作。例如,如果首先减去1,然后首先减少1,然后减少1,然后是1,然后我们将其从大到小之后规定,则只有首先还原3,然后是1。
因此,如果您使用递归,则可以非常简单地获得答案。代码如下:
我们模仿上述问题并使用相同的想法。首先,我们找到了最大的策略m,然后从M. each Time中递归不过是两个选项,使用M,而不是M.如果您使用M,然后使用量。-m,如果您不使用M,请考虑M/2的策略。
由于原始标题中只有一个输入,因此我们需要在该函数中定义另一个函数:
这个问题是一个附加的问题,这并不困难。
首先,我们可以使用匿名功能进行递归。例如,我们使用匿名函数来计算顺序:
尽管我们使用匿名函数,但我们也有一个函数名称事实。
要求只能实现一行代码,并且在实现中不能使用分配,功能定义和递归,也不能在返回声明中调用该函数。
当您得到这样的话题时,第一个反应估计是一个圆圈,但是当您冷静下来时,您实际上可以找到自己的想法。我们需要做的第一件事就是找到问题。我们现在不知道该如何实现。实际上,我们不会遇到实际问题。最大的问题是我们不会遇到实际问题本身。因此,我们必须首先分析问题并找到问题。
显然,根据示例,我们需要返回功能,然后我们必须使用关键字来定义匿名函数才能返回。
我们可以尝试编写匿名函数:
如果写它,您会发现问题。这里的函数未定义,这种不明显的函数实际上是我们编写的匿名函数。换句话说,我们必须在匿名函数中实现递归,以便它可以自我调用。
但是主题是有限的,我们不能使用分配语句将其命名,并且我们不能在不知道函数名称的情况下调用该函数。因此,在这里出现了困难。
实际上,可以解决此问题。如何解决它?我们将功能作为参数传递,而不是直接通过名称获得:
但是,这本质上是传递递归过程f函数f的转移,我们仍然必须实现一个可以递归的匿名函数f。由于本身是递归函数,因此上述代码实际上可以写为:
在上述想法中,F仅具有递归的逻辑,但实际上并非如此。F还需要知道X何时结束的X值。因此,还必须将X引入F中,但这仍然无法解决不令人满意的递归问题。
这个问题是这个问题的核心困难。解决该问题的关键隐藏在主题给出的样本中:
当我们仔细查看这条代码时,我们会发现这条代码本身非常混乱。如果Python解析器在右侧执行该功能,然后在左侧进行攻击,则右侧的匿名函数为实际上,当变量未串成时,实际上不具有约束力。如果您想绑有死周期。
因此,我猜想,尽管Python解释器可能首先在右侧执行句子,然后绑定句子,但在执行右侧之前已经创建了左侧的变量。执行时不会执行严格的检查。只有这样,它才不会陷入死周期。
这实际上是一个参数和结果。我们必须使用它来解决问题。我们让我们的F既是参数又是结果。
我们在f函数中添加一个参数,接收传输函数,并且可以用传输函数递归地调用,尽管此函数本身是:
尽管仅使用Python的基本语法,但要进行几个弯曲并不容易。这样做并不容易。
我不禁让我感到,这确实是伯克利...