zoukankan      html  css  js  c++  java
  • 递归该怎么写(一)

    递归定义

    递归:无限调用自身这个函数,每次调用总会改动一个关键变量,直到这个关键变量达到边界的时候,不再调用。

    我们现在开始来举例子,然后总结如何写好递归程序。(这种针对可以找出数学表达式的递归程序,对于写不出数学表达式的或者不好找的会在之后的博客中补充)

    例子1: n的阶乘。

    我们先来写出数学表达式

    代码部分

    1 __author__ = "WSX"
    2 
    3 def f(n):
    4     if n == 1:
    5         return 1
    6     else:
    7         return f(n-1) * n
    8 
    9 print(f(3))

    例子 2: 斐波那契数列

    我们还是来写数学表达式,嘿嘿。

    相应代码:

    1 __author__ = "WSX"
    2 def fib(n):
    3     if n == 1:
    4         return 1
    5     if n == 2:
    6         return 1
    7     if n>2:
    8         return fib(n-2) + fib(n-1)
    9 print(fib(4))

    例子3 :求最大公约数

    老样子,先写数学表达式。是不是感觉没啥难度了(可以用数学表达出来的)

    return 就是等号 !!!

    代码:

    1 __author__ = "WSX"
    2 
    3 def gcb(a, b):
    4     if a%b == 0:
    5         return b
    6     else:
    7         return gcb(b, a%b)

    到了这里是不是对于这种类型的递归已经能十分简单的写出来了?  我们在看一个稍微高级一点点的例子

    例子4: 二分查找

    写表达式,你会想这个表达式怎么写??? 下面我们来看。

    代码:

     1 __author__ = "WSX"
     2 
     3 def s(L , left , right , target):
     4     mid = (left + right) // 2
     5     if target == L[mid]:
     6         return mid
     7     if left > right:
     8         return None
     9     if target > L[mid]:
    10         return s(L,mid+1 , right,target)
    11     else:
    12         return s(L, left, mid-1, target)
    13 L = [3,5,7,8,55,88]
    14 print(s(L, 0 ,len(L),88))

    我总结的经验是:

    确定需要递归的参数

    写出递归的表达式(一定找到出口) 就是结束的条件

    将表达式转化为代码(函数名 = 表达式左侧        函数内部 = 表达式右侧        return = 等号)

  • 相关阅读:
    NYOJ 10 skiing DFS+DP
    51nod 1270 数组的最大代价
    HDU 4635 Strongly connected
    HDU 4612 Warm up
    POJ 3177 Redundant Paths
    HDU 1629 迷宫城堡
    uva 796
    uva 315
    POJ 3180 The Cow Prom
    POJ 1236 Network of Schools
  • 原文地址:https://www.cnblogs.com/WSX1994/p/10751446.html
Copyright © 2011-2022 走看看