编程求解:输入两个整数 n 和 m ,从数列 1 , 2 , 3...n 中 随意取几个数 , 使其和等于 m , 要求将其中所有的可能组合列出来
初学者,请大神指教
n, m = gets.split.map! { |e| e.to_i }
(1..n).each { |i| (1..n).to_a.combination(i) { |arr| print arr.join("+"), "\n" if arr.inject { |sum, x| sum + x } == m } }
这次我也一行党...
def coushu(n, m)
(1..n).each { |i| (1..n).to_a.combination(i).each { |j| p j if j.inject(:+) == m } }
end
def coushu(n, m)
(1..n).each{|i| [*1..n].combination(i).each { |j| p j if j.inject(:+) == m }}
end
小改一下作业。这个在算法上叫枚举法吧。
如楼上所说:
def coushu(n, m, confirmed=[], &b)
if n == 0
if m == 0
yield confirmed
end
else
coushu(n-1, m-n, confirmed + [n], &b)
coushu(n-1, m, confirmed, &b)
end
end
coushu(10, 15) {|x| p x }
#8 楼 @Alexander 如果给定任意一个数组 arr,随意取几个数 , 使其和等于 m , 要求将其中所有的可能组合列出来,程序又该如何写?
availables = [1,3,..10....]
想要凑起来得 m 有两种情况,1,用 availables 的第一个数,2,不用 availables 的第一个数。然后递归。
对于第一种情况,m = m- availablse[0],下一次的 availables 刨除第一个数。 对于第二种情况,m = m,下一次的 availables 刨除第一个数。
#12 楼 @bluexuemei 程序的构造与解析 应该有这道题。。。你可以问问别人。 或者 http://www-inst.eecs.berkeley.edu/~cs61a/sp14/ ,也应该有类似的题,我忘了在哪了。。。都是关于找钱的,就是有几种硬币,然后一凑个整数。
觉得递归都不容易懂,反正我学递归学了好久。。。
#8 楼 @Alexander #11 楼 @yfractal 递归很精彩,学习了
再请问给 4 个数的数组,算 24 点做递归,有优先级的计算和表示问题。
这次我想到的方法跟@blacktulip是一样的 def coushu(n,m) result =.each {|i| [*1..n].combination(i).each {|j| result << j if(j.inject(:+)==m) }} return result end
p coushu(2,2) p coushu(5,7)
[[2]] [[2, 5], [3, 4], [1, 2, 4]]