暴力递归:
- 把问题转化为规模缩小了的同类问题的子问题
- 有明确的不需要继续进行递归的条件(base case)
- 有当得到了子问题的结果之后的决策过程
- 不记录每一个问题的解
1.给定任意正整数n,求n的阶乘
1 def getFactorial(n): 2 if n == 1: 3 return 1 4 return n*getFactorial(n-1)
2.打印n层汉诺塔从最左边移动到最右边的全部过程
1 # 汉诺塔问题 2 # O(2**n) 3 def hanoi(n, A, B, C): 4 if n == 1: 5 print('move %s to %s' % (A, C)) 6 else: 7 hanoi(n-1, A, C, B) 8 hanoi(1, A, B, C) 9 hanoi(n-1, B, A, C)
3.打印一个字符串的全部子序列,包括空字符串
1 # 求字串的所有子序列 2 def printAllSubsquence(test, i, res): 3 if i == len(test): 4 print(res) 5 return 6 printAllSubsquence(test, i+1, res) # 当前位置字符不加入 7 printAllSubsquence(test, i+1, res + test[i]) # 当前位置字符加入
4.打印一个字符串的全部排列,要求不要出现重复的排列
1 # 求字串的全排列 输入为list 2 def printAllPermutations(test, i): 3 if i == len(test): 4 print(''.join(test)) 5 return 6 for j in range(i, len(test)): 7 test[i], test[j] = test[j], test[i] # 依次与当前及之后的数交换 8 printAllPermutations(test, i+1) # 打印当前数之后的全排列 9 test[i], test[j] = test[j], test[i] # 把交换了的数字交换回去