2017-08-27 53 views
0

我正在做一个在Ruby中编写递归合并排序算法的任务。我试图一件一件地将其打破,以便能够围绕它环绕我的头部。到目前为止,我试图完成“分割”步骤,直到每个阵列中只剩下一个元素。Ruby合并排序 - 这个递归函数是如何工作的?

a = [5, 2, 4, 6, 1, 7, 3, 8] 

def divide(arr) 
    return arr if arr.length < 2 
    else 
     arr1 = puts divide(arr[0..arr.length/2-1]) 
     arr2 = puts divide(arr[arr.length/2..arr.length]) 
end 

我想输出是:

[5] [8] 

但它打印出:

5 
2 

4 
6 

1 
7 

3 
8 

它是如何工作的?

+0

人我很困惑,摆脱了现在它只是返回[8]。 –

回答

3

您至少有两个问题。

首先,else声明不起作用,这不是你在Ruby中如何做if else

其次,如果a.length < 2false那么您的方法将返回nilputs返回nil,返回nil

我已经添加了一些版画来展示你的代码是如何工作的,希望对大家有所帮助:

$level = 0 

def divide(arr) 
    return arr if arr.length < 2 

    $level += 1 

    puts "Working with array #{arr}" 

    arr1 = divide(arr[0..arr.length/2-1]) 
    puts "Level = #{$level} arr1 = #{arr1}" 
    arr2 = divide(arr[arr.length/2..arr.length]) 
    puts "Level = #{$level} arr2 = #{arr2}" 

    $level -= 1 

    nil 
end 

divide([5, 2, 4, 6, 1, 7, 3, 8]) 

输出:

Working with array [5, 2, 4, 6, 1, 7, 3, 8] 
Working with array [5, 2, 4, 6] 
Working with array [5, 2] 
Level = 3 arr1 = [5] 
Level = 3 arr2 = [2] 
Level = 3 arr1 = 
Working with array [4, 6] 
Level = 4 arr1 = [4] 
Level = 4 arr2 = [6] 
Level = 4 arr2 = 
Level = 4 arr1 = 
Working with array [1, 7, 3, 8] 
Working with array [1, 7] 
Level = 6 arr1 = [1] 
Level = 6 arr2 = [7] 
Level = 6 arr1 = 
Working with array [3, 8] 
Level = 7 arr1 = [3] 
Level = 7 arr2 = [8] 
Level = 7 arr2 = 
Level = 7 arr2 = 
+0

现在已经迷失在兔子洞里了。我以前从来没有用过这样艰难的努力。我所看到的只是将arr1分开,直到它不能,然后arr2不会像我希望的那样最后4个数字一起工作。不仅数字正在消失,而且不是合并排序应该如何工作。这将是我的死亡。 –

+1

这可能有助于解释为什么* else是无用的(它被解释为隐含的'rescue'块的'else')。顺便说一句,@JacobMoore:你应该养成阅读警告的习惯;你的代码会产生下面的警告:“警告:其他没有救援的人是无用的”,这正是达尼尔正在谈论的。 –