我不确定SO的问题是否正确。最终,我将迁移它。
请考虑清单[1; 2; ..; n]
。有多少种方式可以表示为两个列表的串联?
我给出的答案是n + 1
。我的答案的问题在于它仅基于经验观察。
即。给出3
长度[1; 2; 3]
的列表,我认为我可以将其表示为:
[] @ [1; 2; 3]
[1] @ [2; 3;]
[1; 2] @ [3]
[1; 2; 3] @ []
我的假设是否正确?您如何建议在更强的基础上进行测试?
答案 0 :(得分:2)
你可以通过归纳来证明这一点。
您显示您的公式适用于n = 1
(或n = 0
,如果您想考虑epsilon案例)
然后你表明从n到n = n + 1时你的公式成立。
然后,它对所有n都是正确的。
答案 1 :(得分:1)
你可以从列表的构造中证明这一点:
列表是空列表[]
或一对(a, L)
,其中a
是元素,L
是列表。
形式上
L := []
| (a, L)
现在,要定义连接数:
ncat(L) := 1 if L=[]
ncat(M)+1 if L=(a, M)
这两种情况都很容易看到。除了[]=cat([], [])
之外,没有其他方法可以将两个列表连接到空列表。通过构建,L = cat([a], M)
,因此,与L
已经(M
之后的a
相比,分割buildscript {
repositories {
...
google() // <-- add this
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0'
}
}
的另一种方法是分开allprojects {
repositories {
jcenter()
google()
}
}
。
请注意,能够在另一个列表的头部或尾部连接空列表的特性安全地包含在此证明中,留给勤奋的读者。