所以我是编程的新手,我正在研究Chris Pine的Learn to Program,它教授Ruby。我正在第10章尝试为数组创建自己的方法。我完全失去了,并尝试使用他建议的答案进行建模。摆弄后,我无法得到输出。我运行该程序,它只是结束。我甚至尝试使用他的代码,它给了我同样的问题。
这是我到目前为止所拥有的。
unsorted_array = ['gamma', 'delta', 'beta', 'alpha', 'zeta']
sorted_array = []
def sort some_array
recursive_sort(some_array, [])
end
def recursive_sort(unsorted_array, sorted_array)
if unsorted_array.length <= 0
return sorted_array
end
still_unsorted =[]
smallest = unsorted_array.pop
sorted_array = []
unsorted_array.each do |tested_obj|
if '#{tested_obj}' > smallest
sorted_array.push(smallest)
else
still_unsorted.push(smallest)
smallest = unsorted_array.pop
end
end
recursive_sort(still_unsorted, sorted_array)
end
puts sort(recursive_sort(unsorted_array, sorted_array))
任何建议都将受到赞赏。
答案 0 :(得分:1)
以下是对您的代码的一些观察:
test_obj
是一个字符串,'#{tested_obj}'
与#{tested_obj}
相同,与tested_obj
相同。sorted_array = []
无效。作为局部变量,它不在方法recursive_sort
的范围内。该方法接收一个它调用sorted_array
的数组,因此您无论如何都不希望它被初始化。still_unsorted
;只需将元素从unsorted_array
转移到sorted_array
即可。 下面我修复并收紧了你的代码。
def recursive_sort(unsorted_array, sorted_array = [])
return sorted_array unless unsorted_array.length > 0
smallest = unsorted_array.min
unsorted_array.each {|e| sorted_array << e if e == smallest}
unsorted_array.delete(smallest)
recursive_sort(unsorted_array, sorted_array)
end
unsorted_array = ['gamma', 'alpha', 'delta', 'beta', 'gamma', 'alpha', 'zeta']
p recursive_sort unsorted_array
# => ["alpha", "alpha", "beta", "delta", "gamma", "gamma", "zeta"]
以下是发生的事情:
sorted_value
)的第二个参数设置一个默认值[]
(一个空数组),不需要你以前的方法sort
。 sorted_array
(与return sorted_array if unsorted_array.length == 0
相同)。Enumerable#min
查找未排序项目的最小值(smallest
)。 smallest
中的unsorted_array
的每个实例添加到sorted_array
。smallest
中unsorted_array
的所有实例。 请注意
unsorted_array.each {|e| sorted_array << e if e == smallest}
可以用许多不同的方式表达。这是一个:
sorted_array += [smallest]*(unsorted_array.count {|e| e == smallest})
要了解其工作原理,请假设smallest = 'alpha'
。然后
unsorted_array.count {|e| e == 'alpha'} # => 2
所以上面的表达是:
sorted_array += ['alpha']*2
是
sorted_array += ['alpha', 'alpha']
将两个"alpha"
添加到sorted_array
。