我正在尝试将这个递归的例子从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
答案 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)
)不同。