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

标签 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

它是如何工作的?

最佳答案

你至少有两个问题。

首先,else声明没有效果,这不是你怎么做if else在 Ruby 中。

其次,如果a.length < 2false那么你的方法将返回 nil . puts返回 nil , x = 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 =

关于arrays - Ruby 合并排序——这个递归函数是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45909315/

相关文章:

javascript - Ruby on Rails,当用户不接受条款时使用 jQuery 显示警报

php - 有没有办法在 php 中获取两个数组之间的公共(public)值?

java - 井字游戏 'X' 直到第二个 'O' 被点击后才出现

java - 如何将两个数组合并成各自的二维数组?

PHP 数组 - 分隔相同的值

algorithm - 在二进制矩阵中找到最小成本

ruby-on-rails - 为什么 Rails 会在同一 session 的每个请求中更改 Set-Cookie header

ruby - 清理来自 open(url).read 的内容

python - 从一组 3D 点中采样 N 个点,使最小距离最大化

java - 下面的代码问题解决方案在本地 IDE 中对我有用,但在 Hackerrank IDE 中以某种方式失败,我的代码是否有任何问题