当前位置: 首页 > 知识库问答 >
问题:

Ruby中的Lucas序列

蔡明贤
2023-03-14

Lucas序列是一个数字序列,序列的第一个数字是2,Lucas序列的第二个数字是1,要生成序列的下一个数字,我们把前面两个数字相加,例如序列的前六个数字是:2, 1, 3, 4, 7, 11,...

编写一个方法lucasSequence,该方法接受一个表示长度的数字作为参数。该方法应返回一个包含Lucas序列的数组,其长度不超过给定长度。递归解决此问题。

def lucas_sequence(length)
    return [] if length == 0
    return [2] if length == 1
    return [2, 1] if length == 2

    seq = lucas_sequence(length - 1)
    next_el = seq[-1] + seq[-2]
    seq << next_el
    seq
end

p lucas_sequence(0)   # => []
p lucas_sequence(1)   # => [2]    
p lucas_sequence(2)   # => [2, 1]
p lucas_sequence(3)   # => [2, 1, 3]
p lucas_sequence(6)   # => [2, 1, 3, 4, 7, 11]
p lucas_sequence(8)   # => [2, 1, 3, 4, 7, 11, 18, 29]

**我很难理解这背后的递归逻辑。有人能解释一下计算机是如何解决这个问题的吗?计算机是否读取长度,然后从[2,1]开始累加,直到达到其长度?如果是这样,它是如何持续倒计时的**

共有2个答案

子车俊材
2023-03-14

所以它本质上是一个修正的斐波那契序列。解决大多数结构化序列的最佳方法是使用枚举器,例如。

lucas = Enumerator.new do |y|
  a,b = 2,1
  loop do
    y << a
    a, b = b, a + b
  end
end

然后

lucas.first(10)
#=> [2, 1, 3, 4, 7, 11, 18, 29, 47, 76]

首先,我们创建一个新的枚举器,然后将a和b分配给起始值(分别为2和1)。

为了生成序列,我们使用一个循环,它将延迟地将值生成给yielder(y)。

在这里,我们推入a,然后我们将a分配给bs值,将bs值分配给a b并行以避免在添加ab之前覆盖a

席俊达
2023-03-14

递归是数学归纳法的编程等价物。给定一个序列,假设该序列的前一个成员的问题已解决,并提供生成此成员的规则。

因此,请考虑以下几行:

def lucas_sequence(length)
    seq = lucas_sequence(length - 1) # <1>
    next_el = seq[-1] + seq[-2] # <2>
    seq << next_el # <3>
    seq # <4>
end

也就是说:

>

把那个较短序列的最后两个成员加起来。。。

。。。并将总和附加到较短的序列中。。。

。。。结果就是这个序列,就是你要求的序列。

这基本上就是它的全部!唯一的问题是没有地方可以开始。我们假设对于长度4的seq,我们已经解决了3个,我们假设我们已经解决了2个,我们假设我们已经解决了1个...但是我们实际上还没有解决这些问题!

因此,我们首先支持最严重的案件:

return [] if length == 0
return [2] if length == 1
return [2, 1] if length == 2

如果长度是0、1或2,问题就解决了,因为我们直接给出这些答案。好吧,如果长度是3,我们参考2求解,这是已知的。好吧,如果长度是4,我们参考3求解,我刚刚告诉了你如何做到这一点。好吧,如果长度是5,我们参考4求解,我刚刚告诉了你如何做到这一点。以此类推,对于你想给我的任何长度。

 类似资料:
  • 我正在尝试编写一个ruby方法,它可以递归地执行合并排序。我有这个方法,但这是一次我偶然得到它的工作,所以我不知道它为什么工作,并很想了解我写的代码是如何工作的。在psuedocode中,我遵循的步骤如下所示。 拆分长度为n的原始数组,直到我拥有长度为1的n个数组 一次合并和排序长度为m的2个数组,以返回长度为m*2的数组 重复上述步骤,直到我有一个长度为n的当前排序数组 基本上,在我看来,这是一

  • 本文向大家介绍Ruby范围作为序列,包括了Ruby范围作为序列的使用技巧和注意事项,需要的朋友参考一下 示例 范围最重要的用途是表达序列 语法: 要么 最重要的end值必须大于begin,否则将不返回任何值。 例子:            

  • 作为一个入门级的程序员,用ruby写的一个小脚本,可以采集某人才网的人才数据,写的不好。头一次发布,希望大大们批评指正。 采集某网站的人才数据,保存到csv文件中,同时导入数据库

  • 本文向大家介绍Ruby中的变量,包括了Ruby中的变量的使用技巧和注意事项,需要的朋友参考一下 Ruby变量 Ruby支持以下类型的变量: 实例变量 类变量 局部变量 全局变量 1)实例变量 一个实例变量总是开头@。如果您不初始化实例变量,那么它将在编译时从编译器获取nil值。它们的值对于对象的某些实例是有限的或局部的。存在一个实例变量的多个副本,并且同一类的每个对象都可以访问其实例变量的本地副本

  • 在Apache上运行ruby文件需要启用。Apache还可以通过FastCGI处理ruby文件。在即FastCGI的帮助下,可以使用多个版本的。 还可以安装apache乘客并配置Apache以使用它来提供ruby页面。 (Phusion Passenger也称为“乘客”是一个免费的Web服务器模块,旨在与Apache和Nginx集成) 在服务器上安装的步骤如下 - 如何使用Apache运行Ruby

  • 我是Ruby的新手,正在尝试我在Ruby中的前几个程序来理解这些概念。现在,在类方法概念中,在尝试基础知识时,我遇到了以下问题。 我有一个类方法“Servers.valid_requestor”。 这应该检查提供的用户名是否有效,它基于我正在使用的预定义用户名,如果是,它应该在main中执行某些代码。 现在这里的问题是,每当我尝试使用myI获取用户名nput.user_name它返回my_inpu