Ruby合并排序 - 这个递归函数如何工作?

时间:2017-08-27 21:00:42

标签: arrays ruby algorithm recursion mergesort

我正在做一个在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

它是如何运作的?

1 个答案:

答案 0 :(得分:3)

你至少有两个问题。

首先,else语句没有效果,而不是你在Ruby中if else的做法。

其次,如果a.length < 2false,那么您的方法将返回nilputs返回nilx = 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 =