递归:反转字符串

字符串也可以考虑使用递归

  1. 假如子问题已经完成了反转
  2. 两侧的字符行交换
  3. l>=r停止即可
    递归:反转字符串_第1张图片

先递归再处理

s = list("abcdefgh")
def dfs(arr, l, r):
    if l >= r: # 递归的终止条件
        return
    dfs(arr,l+1,r-1) # 缩减问题的规模,重复操作
    arr[l],arr[r] = arr[r],arr[l] # 重复操作部分。交换左右的两个字符
dfs(s,0,len(s)-1)
print(s)

先处理再递归

这个递归很简单,但是我在实现的时候发现了另一种想法,就是先进行交换,然后再去处理子问题,这种方式也是对的。先后递归再处理和先处理再递归结果竟然是一样的。

打印二叉树的时候

  • 先打印再递归对应的是先序遍历
  • 先递归再打印的是中序遍历

不同顺序对应的结果也是不同的,为什么这里的结果是相同的呢?其实在这里我想错了,先交换后递归和先递归后交换虽然结果相同,但是中间操作是不同的。

  • 先交换后递归是从两侧往中间改变的
  • 先递归后交换是从中间往两侧改变的

二叉树遍历的时候不管先序还是中序也都是把所有节点遍历一遍。

s = list("abcdefgh")
def dfs(arr, l, r):
    if l >= r: # 递归的终止条件
        return
    arr[l],arr[r] = arr[r],arr[l] # 重复操作部分。交换左右的两个字符
    dfs(arr,l+1,r-1) # 缩减问题的规模,重复操作
    

dfs(s,0,len(s)-1)
print(s)

你可能感兴趣的:(递归,深度优先,算法)