递归(python组蓝桥杯备赛)

概念:通过自我调用来解决问题的函数

递归通常把一个大型复杂的问题层层转化为一个与原问题相似规模较小的问题来求解。
递归要注意:

  1. 递归出口 
  2. 当前问题如何变成子问题

经典案例

阶乘:

求n的阶乘转化为n-1的阶乘

求f(5)不断调用自身直到f(1)出口,计算出结果。

递归(python组蓝桥杯备赛)_第1张图片

具体代码:

def f(n):
    if n == 0 or n == 1:
        return 1
    else:
        return n * f(n - 1)
print(f(5))

汉诺塔问题

递归(python组蓝桥杯备赛)_第2张图片

递归(python组蓝桥杯备赛)_第3张图片

递归(python组蓝桥杯备赛)_第4张图片

递归(python组蓝桥杯备赛)_第5张图片

递归(python组蓝桥杯备赛)_第6张图片

递归(python组蓝桥杯备赛)_第7张图片

递归(python组蓝桥杯备赛)_第8张图片

递归(python组蓝桥杯备赛)_第9张图片

递归(python组蓝桥杯备赛)_第10张图片

剖析问题:


考虑n个盘子的时候,将上面n-1个盘子看做一个整体

1、首先需要将n-1个盘子从A挪到B,通过C,这就变成递归的问题Move(n-1,A,C,B);

2、然后移动:A->C

3、最后将n-1个盘子从B挪到C,通过A,Move(n-1,B,A,C);

具体代码:

def move(n, A, B, C):
    if n == 0: #如果没有盘子需要移动,返回
        return
    move(n-1, A, C, B) #将n-1个盘子移到 B
    print("{}->{}".format(A, C)) #将剩下的第n个盘子移到 C
    move(n-1, B, A, C) #将在B处的n-1个盘子移到C
move(3,'A','B','C')

蓝桥第760题:数的计算

递归(python组蓝桥杯备赛)_第11张图片

解题前先找几个示例

比如输入时6,则6 16 26 36 126 136 共有6个数字(自己本身不加任何数也算)

  • 那么要找出关键的子问题和子问题与母问题之间的联系,也就是n 和n - 1之间的关系
  • 过程讲解:6 前面可以加 1 2 3,如果加了2和3,前面还可以加1,也可以不加,故递归的前提条件:把每个ans都等于1(必须加自身)。
  • 子问题与母问题之间的关系为f(n)=f(i)的方案之和,而i<=n//2
  • 而递归的出口是n = 1的时候,肯定是1。 

思路已清,故破局之法已有,具体代码如下:

import os
import sys

# 请在此输入您的代码
def f(n):
  ans = 1
  if n == 1:
    return 1
  for i in range(1,n//2 + 1):
    ans += f(i)
  return ans
n = int(input())
print(f(n))

你可能感兴趣的:(蓝桥杯备赛,算法)