9-22算法实验报告
1. 给出n,输出n对合法的括号组合
yupackage main
import "fmt"
/**
给出n,打印出n对合法的括号对组合,例如n=3,输出如下:
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
*/
func printBrackets(n int) {
printStrWithBrackets(n,n,"")
}
// 递归:左括号 和 右括号
func printStrWithBrackets(leftB, rightB int, s string) {
if leftB == rightB && leftB == 0 {
fmt.Println(s)
}
if leftB > 0 {
printStrWithBrackets(leftB - 1,rightB, s + "(")
}
if leftB < rightB {
printStrWithBrackets(leftB, rightB - 1, s + ")")
}
}
func main() {
fmt.Println("n = 2:")
printBrackets(2)
fmt.Println()
fmt.Println("n = 3:")
printBrackets(3)
fmt.Println()
fmt.Println("n = 4:")
printBrackets(4)
fmt.Println()
}
运行 main 函数后的结果:
总结
该题使用递归完成,从题意可得:需要尽可能地消耗掉左括号"(";故在递归中除了边界条件,当还有剩余左括号时,优先压栈,直到左括号数量为0,再将右括号压栈。当括号数量均为0时,可以打印结果。
2. 用换元法求解递归式,设 A(1) = 0
A ( n ) = ( n − 1 ) + ∑ i = 0 n − 1 1 n [ A ( i ) + A ( n − 1 − i ) ] A(n) = (n-1) + \sum_{i=0}^{n-1}\frac{1}{n}[A(i) + A(n - 1- i)] A(n)=(n−1)+i=0∑n−1n1[A(i)+A(n−1−i)]
解:
已知:
A ( 1 ) = A ( 0 ) = 0 A(1) = A(0) = 0 A(1)=A(0)=0
整理原式,得:
A ( n ) = ( n − 1 ) + 2 n ∑ i = 0 n − 1 A ( i ) A(n) = (n - 1) + \frac{2}{n}\sum_{i = 0}^{n-1}A(i) A(n)=(n−1)+n2i=0∑n−1A(i)
构造下列函数:
n A ( n ) − ( n − 1 ) A ( n − 1 ) = n ( n − 1 ) + 2 ∑ i = 0 n − 1 A ( i ) − ( n − 1 ) ( n − 2 ) − 2 ∑ i = 0 n − 2 A ( i ) nA(n) - (n-1)A(n-1) = n(n-1) + 2\sum_{i = 0}^{n-1}A(i) - (n-1)(n-2)-2\sum_{i=0}^{n-2}A(i) nA(n)−(n−1)A(n−1)=n(n−1)+2i=0∑n−1A(i)−(n−1)(n−2)−2i=0∑n−2A(i)
整理得:
n A ( n ) = ( n + 1 ) A ( n − 1 ) + 2 ( n − 1 ) nA(n) = (n+1)A(n-1)+2(n-1) nA(n)=(n+1)A(n−1)+2(n−1)
即:
A ( n ) n + 1 = A ( n − 1 ) n + 2 ( n − 1 ) n ( n + 1 ) \frac{A(n)}{n+1} = \frac{A(n-1)}{n} + \frac{2(n-1)}{n(n+1)} n+1A(n)=nA(n−1)+n(n+1)2(n−1)
令:
B ( n ) = A ( n ) n + 1 B ( 1 ) = B ( 0 ) = 0 B(n) = \frac{A(n)}{n+1} \\ B(1) = B(0) = 0 B(n)=n+1A(n)B(1)=B(0