2017-07-22 50 views
1

我想把這個從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 

回答

4

從js代碼不同的是,你不能定義了一種方法,紅寶石的方法中,所以必須定義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) 

下面是與拉姆達的例子:

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))不同

+1

不錯。對於第一個示例,不需要爲默認參數定義第二個方法。你可以使用'find(target,start = 1,history =「1」)' –

+0

使用助手方法絕對讓我更好地理解它。謝謝!我將研究lambda函數以及如何使用它們。在這個問題中是否有任何理由使用lambda超過proc? – danraybernard

+0

不客氣。不,lambdas和procs之間的差異不會影響解決方案。 –

相關問題