根据用户插入的值计算斐波那契数列位置

calculate fibonacci sequence position from user inserted value

下面是我的完整程序代码:

GradeAvg = [[59, 'F'], [69, 'D'], [79, 'C'], [89, 'B'], [100, 'A']]

def letter_grade
  num = number_grade
  _, letter = GradeAvg.find { |n, _| num <= n }
  [num, letter]
end

def number_grade
  loop do
    puts 'Please insert a number between 1 and 100.'
    num = gets.to_i
    break(num) if (1..100).cover?(num)
  end
end

def fib(n)
  return n if n < 2

  fib(n-1) + fib(n-2)
end

10.times { print letter_grade; (num).each { |n| puts fib(n) }; puts }

失败并出现以下错误:

undefined local variable or method `num' for main:Object (NameError)

为什么我不能将我的斐波那契数列计算应用于变量 num 中可接受的用户插入值?

您正在尝试访问在 letter_grade 中分配的 num。您必须使用函数调用的 return 值(即 num, letter = letter_grade)来读取结果。

还需要注意的是,Fixnum#each(即(num).each)不是方法。 10.times { ... } 虽然已经循环了,所以我认为这只是您的疏忽。

请参阅 粗体 部分了解更改。我还更改了您的斐波那契函数以线性时间计算(而不是指数时间)

GradeAvg = [[59, 'F'], [69, 'D'], [79, 'C'], [89, 'B'], [100, 'A']]

def number_grade
  loop do
    <b>print</b> "Please insert a number between 1 and 100."
    num = gets.to_i
    break(num) if (1..100).cover?(num)
  end
end

def letter_grade
  num = number_grade
  _, letter = GradeAvg.find { |n, _| num <= n }
  [num, letter]
end

def fib (n, a = 0, b = 1)
  if n == 0 then
    a
  else
    fib n - 1, b, a + b
  end
end

10.times do
  <b>num, letter = letter_grade
  puts letter
  puts (fib num)</b>
end

示例程序执行

# Please insert a number between 1 and 100. 95
# A
# 31940434634990099905
# Please insert a number between 1 and 100. 87
# B
# 679891637638612258
# Please insert a number between 1 and 100. 77
# C
# 5527939700884757
# Please insert a number between 1 and 100. 66
# D
# 27777890035288
# Please insert a number between 1 and 100. 55
# F
# 139583862445
# Please insert a number between 1 and 100. 10
# F
# 55
# Please insert a number between 1 and 100. ...
# ...

这样试试:

GradeAvg = [[59, 'F'], [69, 'D'], [79, 'C'], [89, 'B'], [100, 'A']]

def letter_grade
  @num = number_grade
  _, letter = GradeAvg.find { |n, _| @num <= n }
  [@num, letter]
end

def number_grade
  loop do
    puts 'Please insert a number between 1 and 100.'
    @num = gets.to_i
    break(@num) if (1..100).cover?(@num)
  end
end

def fib(n)
  return n if n < 2

  fib(n-1) + fib(n-2)
end

10.times { print letter_grade; puts fib(@num)}