Ruby 使用递归查找与给定数字相等的和和和积序列
我试图将这个递归示例从有说服力的Javascript翻译成RubyRuby 使用递归查找与给定数字相等的和和和积序列,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
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中,它创建一个方法,当您调用它时,该方法定义另一个方法。