根据用户插入的值计算斐波那契数列位置
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)}
下面是我的完整程序代码:
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)}