Ruby 使用递归查找与给定数字相等的和和和积序列

Ruby 使用递归查找与给定数字相等的和和和积序列,ruby,recursion,methods,Ruby,Recursion,Methods,我试图将这个递归示例从有说服力的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

我试图将这个递归示例从有说服力的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 
def查找解决方案(n)
i=1
history=“”
如果(i*=3)>n&(i+=5)>n
归零
如果i==n
回归历史
其他的

return(i*=3&&history与js代码的不同之处在于,在ruby中无法在方法内部定义方法,因此必须在
find\u solution
之外定义
find
或使用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)
def find(目标、开始、历史)
如果开始=目标
历史
elsif开始<目标
查找(目标,开始+5“(“+history+”+5)”)||
查找(目标,开始*3,(“+历史+”*3)”);
结束
结束
def查找解决方案(目标)
查找(目标,1,“1”)
结束
放置查找解决方案(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)
def find_解决方案(目标)
查找=->(开始,历史记录){
如果开始=目标
历史
elsif开始<目标
查找。(开始+5“(“+history+”+5)”)||
查找。(开始*3,(“+历史+”*3)”);
结束
}
查找。(1,“1”)
结束
放置查找解决方案(24)

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

与js代码的区别在于,在ruby中无法在方法内部定义方法,因此必须在
find\u solution
之外定义
find
,或者使用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)
def find(目标、开始、历史)
如果开始=目标
历史
elsif开始<目标
查找(目标,开始+5“(“+history+”+5)”)||
查找(目标,开始*3,(“+历史+”*3)”);
结束
结束
def查找解决方案(目标)
查找(目标,1,“1”)
结束
放置查找解决方案(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)
def find_解决方案(目标)
查找=->(开始,历史记录){
如果开始=目标
历史
elsif开始<目标
查找。(开始+5“(“+history+”+5)”)||
查找。(开始*3,(“+历史+”*3)”);
结束
}
查找。(1,“1”)
结束
放置查找解决方案(24)

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

Nice。对于第一个示例,不需要为默认参数定义第二个方法。您可以使用
find(target,start=1,history=“1”)
使用helper方法肯定会让我更好地理解它。谢谢!我将研究lambda函数以及如何使用它们。在这个问题上有没有理由使用lambda over proc?不客气。不,lambdas和procs之间的差异不会影响解决方案。Dan,请将您的评论通知Eric你需要在评论中加入“@EricDuminil”。(即使我没有在danraybernard的评论中加入,你也会被告知我发布了它,因为这是你的问题。)你可以在Ruby的方法定义中嵌套一个方法定义,它的意思与在ECMAScript中完全不同(或Scheme、Scala或任何带有嵌套子例程的语言)。在ECMAScript中,它创建了一个嵌套在外部函数中的函数。在Ruby中,它创建了一个方法,当您调用它时,它定义了另一个方法。Nice。对于第一个示例,不需要仅为默认参数定义第二个方法。您可以使用
find(目标,开始=1,历史=1)
使用helper方法肯定会让我更好地理解它。谢谢!我将研究lambda函数以及如何使用它们。在这个问题上有没有理由使用lambda over proc?不客气。不,lambdas和procs之间的差异不会影响解决方案。Dan,请将您的评论通知Eric你需要在评论中加入“@EricDuminil”。(即使我没有在danraybernard的评论中加入,你也会被告知我发布了它,因为这是你的问题。)你可以在Ruby的方法定义中嵌套一个方法定义,它的意思与在ECMAScript中完全不同(或Scheme、Scala或任何带有嵌套子例程的语言)。在ECMAScript中,它创建一个嵌套在外部函数中的函数。在Ruby中,它创建一个方法,当您调用它时,该方法定义另一个方法。