斐波那契数列使用类和方法

时间:2018-09-10 06:02:26

标签: ruby class methods

我写了一个斐波那契数列方法并尝试调用它。使用以下代码可以正常工作:

module Fibonacci
  class Operation
    def fibonacci(n)
      num1 = 0
      num2 = 1
      while num2 < n
        puts num2
        num1, num2 = num2, num1 + num2
      end
    end
end

  res = Operation.new
  puts 'Enter the number upto which Fibonacci needs to be printed:'
  n = gets.chomp.to_i
  res.fibonacci(n)
end

但是我想有一个单独的方法来接受类中的输入并调用它。

module Fibonacci
  class Operation
    def input
    puts 'Enter the number upto which Fibonacci needs to be printed:'
    n = gets.chomp.to_i
    end
    def fibonacci(n)
      num1 = 0
      num2 = 1
      while num2 < n
        puts num2
        num1, num2 = num2, num1 + num2
      end
    end
end

  res = Operation.new
  res.input
  res.fibonacci(n)
end

遇到错误!..我是新手,如果能得到支持,会很有帮助..谢谢

3 个答案:

答案 0 :(得分:0)

将代码更改为:

ng-class

并删除def input puts 'Enter the number upto which Fibonacci needs to be printed:' n = gets.chomp.to_i fibonacci(n) end

这是完整的代码:

res.fibonacci(n)

希望这会有所帮助。

答案 1 :(得分:0)

如果您指定了确切的错误,它可能会提供极大帮助,但让我猜测:有点“ NameError:未定义的局部变量或方法'n'”

之所以发生这种情况,是因为您在调用fibonacci时没有传递参数。如果未指定,则可以选择从用户输入中获取变量:

  class Operation
    def input
      puts 'Enter the number upto which Fibonacci needs to be printed:'
      gets.chomp.to_i
    end

    def fibonacci(n = -1)
      # HERE
      n = input if n <= 0

      num1 = 0
      num2 = 1
      while num2 < n
        puts num2
        num1, num2 = num2, num1 + num2
      end
    end
  end

  res = Operation.new
  res.fibonacci(5)
  #⇒ 1 1 2 3

  res.fibonacci
  #⇒ 'Enter the number ...'

答案 2 :(得分:0)

就目前而言,您的代码未使用input函数的返回值;它消失在以太坊中,并且您的呼叫者正在尝试访问一个未定义的n。如果您将呼叫代码编写为:

res = Operation.new
res.fibonacci(res.input)

然后,您将返回值从res.input传递到res.fibonacci,就可以解决您的直接问题。

除此之外,我认为您的代码中存在一些值得注意的设计问题,您可以考虑一下。函数应该是模块化的,并且避免使用side-effects(例如打印),这会严重限制其功能和灵活性。如果您希望生成斐波那契数并将其用于程序中的其他内容该怎么办?您必须再次重写整个功能。如果只编写一次以填充并返回一个数组,则让调用者决定是否打印输出,将其保存在数据库中,通过套接字发送,反转,然后将其发送到另一个函数中(您知道了)。

请避免使用hard-coded值,例如字符串和数字。您的input函数只能用于收集斐波那契数字,因此无法工作。如果让呼叫者决定消息内容该怎么办?然后,当您向Operation类添加更多数学函数时,可以重用相同的input例程。

我还认为,类似input的函数不属于Operator类。我可以看到它在该类中用作实用程序函数,但是它独立于Operator之类的东西,并且太小了,无法在任何情况下保证其自身的功能。

这里是重新编写,可以在一定程度上缓解这些问题:

module Fibonacci
  class Operation
    def input(message)
      puts message
      gets.chomp.to_i
    end

    def fibonacci(n)
      num1 = 0
      num2 = 1
      result = []

      while num2 < n
        result << num2
        num1, num2 = num2, num1 + num2
      end

      result
    end
  end

  res = Operation.new
  puts res.fibonacci(res.input 'Enter the number upto which Fibonacci needs to be printed:')
end

然后运行示例:

Enter the number upto which Fibonacci needs to be printed:
 15
1
1
2
3
5
8
13

在此repl上进行测试。