【问题标题】:Fibonacci Series using classes and methods使用类和方法的斐波那契数列
【发布时间】:2018-09-10 06:02:26
【问题描述】:

我写了一个斐波那契数列方法并尝试调用它。它适用于以下代码:

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

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

【问题讨论】:

  • “出现错误!”不是一个足够精确的错误描述,我们无法帮助您。 什么不起作用? 如何不起作用?你的代码有什么问题?您收到错误消息吗?错误信息是什么?你得到的结果不是你期望的结果吗?你期望什么结果,为什么,你得到的结果是什么,两者有什么不同?您正在观察的行为不是期望的行为吗?期望的行为是什么,为什么,观察到的行为是什么,它们有何不同?

标签: ruby class methods


【解决方案1】:

就目前而言,您的代码不使用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

【讨论】:

    【解决方案2】:

    将代码更改为:

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

    并删除res.fibonacci(n)

    这里是完整的代码:

    module Fibonacci
      class Operation
        def input
        puts 'Enter the number upto which Fibonacci needs to be printed:'
        n = gets.chomp.to_i
        fibonacci(n)
        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
    end
    

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      如果您指定了确切的错误,这将非常有帮助,但让我猜一下:有点像“NameError: undefined local variable or method `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 ...'
      

      【讨论】:

        猜你喜欢
        • 2021-03-01
        • 2015-06-05
        • 2020-01-18
        • 2014-11-28
        • 1970-01-01
        • 1970-01-01
        • 2016-02-24
        相关资源
        最近更新 更多