Ruby - 是否有一个递归解决方案来查找数字的除数?

时间:2017-04-08 21:02:32

标签: ruby recursion

我正在做一个ruby问题,希望一个方法找到除自身之外的数字的所有除数,输出是一个有序数组。如果该数字是素数,则列出它是素数。

我目前正在尝试教自己递归。简单的递归问题,如找到数字的阶乘是非常基本的理解,但我想知道这个特定的问题是否可以递归完成。它似乎符合可能的标准,但我无法弄明白。

例子n = 15,除此之外的除数是[3,5]。

我的代码解决了这个问题。

require 'prime'

def divisors(n)
  return "#{n} is prime" if Prime.prime?(n) 
  x = n/2
  arr = []
  until x == 1
    arr << x if n % x == 0
    x -= 1
  end 
  arr.sort
end

任何以递归方式执行此操作的帮助都会很棒,或者只是让我知道它不是一个可以通过这种方式完成的问题也会有所帮助。

1 个答案:

答案 0 :(得分:1)

a

该函数被重构以处理三件事:

  • 初始通话(def divisors(n, x=nil) return "#{n} is prime" if Prime.prime?(n) x ||= n/2 arr = [] return arr if x == 1 if n % x == 0 arr << x end (arr.concat divisors(n, x - 1)).sort end
  • 基本情况(提前退货)
  • 迭代逻辑通过递归完成。

重要的是,在迭代期间发生变化的变量(x ||= /2)被放置为方法的参数(具有默认值,因此它基本上可以用作私有参数)

顺便说一下,我个人发现学习Elixir非常有助于理解递归。通过模式匹配和多个功能子句,初始调用,基本情况和迭代可以拆分为自己的方法。