【问题标题】:calculate fibonacci sequence position from user inserted value根据用户插入的值计算斐波那契序列位置
【发布时间】:2018-07-07 11:27:22
【问题描述】:

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

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 中可接受的用户插入值应用我的斐波那契数列计算?

【问题讨论】:

  • 您在这里的实际目标是什么?你想让程序做什么?
  • 计算在斐波那契数列中占据用户选择位置的数字-
  • 错误信息不是骗你的。在此脚本的顶层,您尝试迭代一个名为 num 的变量,该变量未在顶层定义。您希望迭代哪些 vales?
  • num 是通过用户插入的值填充的
  • Doc,除了@naomik 的评论,您需要在一开始就用文字陈述您的问题。标题似乎很接近,但“插入值”含糊不清。一般而言,不应期望读者从代码中破译您尝试执行的操作。

标签: ruby foreach fibonacci


【解决方案1】:

您正在尝试访问在letter_grade 中分配的num。必须使用函数调用的返回值(即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
    print "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
  num, letter = letter_grade
  puts letter
  puts (fib num)
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. ...
# ...

【讨论】:

    【解决方案2】:

    试试这样:

    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)}
    

    【讨论】:

      猜你喜欢
      • 2013-03-31
      • 2020-04-02
      • 1970-01-01
      • 2020-01-18
      • 1970-01-01
      • 2017-07-22
      • 2013-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多