Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';我是否在Ruby中递归地附加到数组的末尾?_Ruby_Arrays_Recursion_Types_Primitive Types - Fatal编程技术网

为什么可以';我是否在Ruby中递归地附加到数组的末尾?

为什么可以';我是否在Ruby中递归地附加到数组的末尾?,ruby,arrays,recursion,types,primitive-types,Ruby,Arrays,Recursion,Types,Primitive Types,我是ruby的新手,遇到了一个在google中找不到答案的错误,或者堆栈溢出 我试图将fibinachi序列的前10个值放入如下数组: #@fib=[] #Maybe try creating the array differently? @fib=Array.new foo=42 puts "foo is of type #{foo.class}" @fib.push(42) #Testing the array puts @fib #Show the test def find_fib(

我是ruby的新手,遇到了一个在google中找不到答案的错误,或者堆栈溢出

我试图将fibinachi序列的前10个值放入如下数组:

#@fib=[] #Maybe try creating the array differently?
@fib=Array.new
foo=42
puts "foo is of type #{foo.class}"
@fib.push(42) #Testing the array

puts @fib #Show the test

def find_fib(anumber)
    return anumber if anumber <= 1
    ( find_fib(anumber - 1) + find_fib(anumber - 2 ))
    #@fib.push(anumber.to_i) #Maybe I need to specify it is an integer http://stackoverflow.com/questions/11466988/ruby-convert-string-to-integer-or-float
    puts "anumber is of type #{anumber.class}"
    puts "They array is of type #{@fib.class}"
    puts "a number is #{anumber}"
    @fib.push(anumber) #<= this line fails
end

puts find_fib(10)

有人能给我解释一下
foo
anumber
之间有什么不同,阻止我附加到数组中吗?毕竟,它们都是“Fixnum”数据类型

对于您发布的错误,这是因为
find\u fib
方法的终止条件返回
anumber
,类型为
Fixnum
。此返回值用于以前的递归:

( find_fib(anumber - 1) + find_fib(anumber - 2 ))
这里您将调用
Array+Fixnum
,这将导致类型检查错误。将终止条件更改为以下可能会删除该错误

def find_fib(anumber)
  return [anumber] if anumber <= 1
  ...
def find_fib(数量)

如果您的方法存在许多问题,请返回[anumber]:

def find_fib(anumber)
  return anumber if anumber <= 1
  (find_fib(anumber - 1) + find_fib(anumber - 2)) # 1
  # ETC...
  @fib.push(number) # 2 and 3
end

顺便说一句,Ruby的惯例是使用2-空格缩进,而不是4-空格缩进。
@fib.push(number)#Johnsyweb感谢您指出这一点。打字错误只存在于SO上,而不存在于我的本地副本上。我在问题中解决了这个问题。@spuder顺便说一句,我认为原始算法的问题之一可能是每个递归调用返回一个数组,该数组表示斐波那契数的加法操作数,而不是该子序列的求和斐波那契数。这只是一种预感,我不是100%确定这是问题所在。你在两个方面都是对的,将一个数字改为[一个数字]消除了错误。算法仍然有一些问题,我现在可以研究一下。
def find_fib(anumber)
  return anumber if anumber <= 1
  (find_fib(anumber - 1) + find_fib(anumber - 2)) # 1
  # ETC...
  @fib.push(number) # 2 and 3
end
def fib(n)
  (n == 1) ? [0] : (2..(n-1)).each_with_object([0,1]) { |i,a| a[i] = a[i-2] + a[i-1] }
end