递归该怎么写(一)

递归该怎么写(一)

递归定义

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

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

例子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 = 等号)

相关推荐