递归该怎么写(一)

递归定义函数

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

咱们如今开始来举例子,而后总结如何写好递归程序。(这种针对能够找出数学表达式的递归程序,对于写不出数学表达式的或者很差找的会在以后的博客中补充)3d

例子1: n的阶乘。code

咱们先来写出数学表达式blog

代码部分递归

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: 斐波那契数列get

咱们仍是来写数学表达式,嘿嘿。博客

相应代码:数学

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 :求最大公约数class

老样子,先写数学表达式。是否是感受没啥难度了(能够用数学表达出来的)

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

相关文章
相关标签/搜索