我有一些问题,有人可以说明如何解决这些问题吗?
1)如何计算特定于级别的列表元素,与排序Exrp无关? 就像元素子集的数量一样。 例如{{1,2,3,4,5},{5,6,7,8,9}},在第1级它应该产生10。 我一直试图通过Count []完成这个,但它不工作,所以即使我选择模式_(我可以单独指定模式,但我不能使用多模式(见下文),如果我指定_然后它计算一些高于目标水平的清单。)
2)我如何使用list作为函数参数(即列表必须包含特定的mathematica expr。)以及如何创建多个模式(f [x_List?NumberQ或EvenQ,y_List)来向列表内容断言像NumberQ或EvenQ这样的内容?NumberQ或EvenQ]
感谢。
答案 0 :(得分:1)
第一个问题已在评论中得到解答。
对于第二个版本,-Q函数不会自动进行线程化 和组合(因为有几种方法可以在列表上组合测试)。 你必须明确地做。
这是一种方法:
f[x_List,y_List]:= Join[x,y] /; (And@@Map[EvenQ,x] && And@@Map[EvenQ,y])
此语法定义如果满足右侧条件,如何计算f
。如果至少有一个测试没有成功,f
将保持未评估状态。
如果您喜欢的测试类型经常出现,您可以定义辅助功能:
测试列表是否仅包含偶数
evenlistQ[x_List]:= And@@Map[EvenQ, x]
测试列表是否仅包含验证test_A和test_B
的项目AandBlistQ[x_List]:= And@@Map[testA[#]&&testB[#]&, x]
测试列表是否仅包含验证test_A或test_B
中的至少一个的项目AorBlistQ[x_List]:= And@@Map[testA[#]||testB[#]&, x]
测试列表是完全验证test_A还是完全验证test_B
AlistOrBlistQ[x_List]:= (And@@Map[testA,x] || And@@Map[testB,x])
然后你可以写
f[ x_List?evenlistQ, y_List?evenlistQ] := Join[x,y]
只有当两个参数都是验证您的要求的列表时才会进行评估,如果不是,则进行评估。
这最后一种形式相当于
f[ x_List, y_List] := Join[x,y] /; (evenlistQ[x]&& evenlistQ[y])
允许更灵活地进行约束验证。