使用递归来查找等于给定数字的和和序列的序列

时间:2017-07-22 08:59:23

标签: ruby recursion methods

我正在尝试将这个递归的例子从Eloquent Javascript翻译成Ruby。

function findSolution(target) {
  function find(start, history) {
    if (start == target)
      return history;
    else if (start > target)
      return null;
    else
      return find(start + 5, "(" + history + " + 5)") ||
             find(start * 3, "(" + history + " * 3)");
  }
  return find(1, "1");
}

console.log(findSolution(24));
// → (((1 * 3) + 5) * 3)

到目前为止,我只有以下内容,我理解这是完全错误的。我试图通过学习重写一个我还不完全理解的概念来挑战自己。

def find_solution(n)
  i = 1 
  history = ""
  if (i *= 3) > n && (i += 5) > n 
    return nil 
  elsif i == n 
    return history 
  else 
    return (i *= 3 && history << "#{i} * 3") || (i += 5 && history << "#{i} + 5")
  end 
  find_solution
end 

1 个答案:

答案 0 :(得分:4)

与js代码的不同之处在于,您无法在ruby中定义方法内部的方法,因此您必须在find之外定义find_solution或使用lambda函数。

以下是使用单独方法的示例:

def find(target, start, history)
  if start == target
    history
  elsif start < target
    find(target, start + 5, "(" + history + " + 5)") ||
      find(target, start * 3, "(" + history + " * 3)");
  end
end

def find_solution(target)
  find(target, 1, "1")
end

puts find_solution(24)

以下是lambda的例子:

def find_solution(target)
  find = ->(start, history) {
    if start == target
      history
    elsif start < target
      find.(start + 5, "(" + history + " + 5)") ||
        find.(start * 3, "(" + history + " * 3)");
    end
  }

  find.(1, "1")
end

puts find_solution(24)

请注意,调用lambda函数与调用常规方法(find.(a, b, c)而不是find(a,b,c))不同。