Loading

day 19 函数递归

1 二分法

算法:是高效解决问题的办法

算法之二分法

需求:有一个按照从小到大顺序排列的数字列表,需要从该数字列表中找到我们想要的那个一个数字,如何做更高效???

nums=[-3,4,7,10,13,21,43,77,89]
find_num=10
nums=[-3,4,13,10,-2,7,89]
nums.sort()
print(nums)
  • 方案一:整体遍历效率太低

     for num in nums:
    	 if num == find_num:
    		 print('find it')
    		 break
    
  • 方案二:二分法

     def binary_search(find_num,列表):
    	 mid_val=找列表中间的值
    	 
    	 if find_num > mid_val:
    		 binary_search(find_num,列表) #接下来的查找应该是在列表的右半部分, 列表=列表切片右半部分
    	 elif find_num < mid_val:
    		 binary_search(find_num,列表) #接下来的查找应该是在列表的左半部分,列表=列表切片左半部分
    	 else:
    		 print('find it')
    
     nums=[-3,4,7,10,13,21,43,77,89]
     find_num=8
    
     def binary_search(find_num,l):#
    	 if len(l) == 0:
    		 print('找的值不存在')
    		 return
    		 
    	 mid_index=len(l) // 2
    	 
    	 if find_num > l[mid_index]:  # 接下来的查找应该是在列表的右半部分
    		 l=l[mid_index+1:]
    		 binary_search(find_num,l)
    		 
    	 elif find_num < l[mid_index]:   # 接下来的查找应该是在列表的左半部分
    		 l=l[:mid_index]
    		 binary_search(find_num,l)
    		 
    	 else:
    		 print('find it')
    		 binary_search(find_num,nums)
    

2 函数递归

2.1 递归的定义

​ 函数不仅可以嵌套定义,还可以嵌套调用,即在调用一个函数的过程中,函数内部又调用另一个函数,而函数的递归调用指的是在调用一个函数的过程中又直接或间接地调用该函数本身

​ 函数的递归调用:是函数嵌套调用的一种特殊形式

​ 具体是指:在调用一个函数的过程中又直接或者间接地调用到本身

img

  • 直接调用本身

     def f1():
    	 print('是我是我还是我')
    	 f1()
    	 
    f1()
    
  • 间接接调用本身,在调用f1的过程中,又调用f2,而在调用f2的过程中又调用f1,这就是间接调用函数f1本身

     def f1():
    	 print('===>f1')
    	 f2()
    
     def f2():
    	 print('===>f2')
    	 f1()
    
     f1()
    

img

一段代码的循环运行的方案有两种

  • 方式一:while、for 循环

    while True:
    	 print(1111)
     	  print(2222)
    	 print(3333)
    
  • 方式二:递归的本质就是循环:

    def f1():
    	 print(1111)
    	 print(2222)
    	 print(3333)
    	 f1()
    
     f1()
    

2.2 需要强调的的一点是:

递归调用不应该无限地调用下去,必须在满足某种条件下结束递归调用

 n=0
 while n < 10:# print(n)
	 n+=1

 def f1(n):
	 if n == 10:
		 return
	 print(n)
	 n+=1

 f1(0)

2.3 递归的两个阶段

回溯:一层一层调用下去

递推:满足某种结束条件,结束递归调用,然后一层一层返回

 def age(n):
	 if n == 1:
		 return 18
	 return age(n-1) + 10

 res=age(5)
 age(5) = age(4) + 10
		  age(4) = age(3) + 10
 				   age(3) = age(2) + 10
							age(2) = age(1) + 10
 									 age(1) = 18
 									 
 print(res)

img

2.4 递归的应用

递归本质就是在做重复的事情,所以理论上递归可以解决的问题循环也都可以解决,只不过在某些情况下,使用递归会更容易实现,比如有一个嵌套多层的列表,要求打印出所有的元素,代码实现如下

 l=[1,2,[3,[4,[5,[6,[7,[8,[9,10,11,[12,[13,]]]]]]]]]]

 def f1(list1):
	 for x in list1:
		 if type(x) is list:       #如果是列表,应该再循环、再判断,即重新运行本身的代码
			 f1(x)
		 else:
			 print(x)

f1(l)

2.5 递归答疑

 nums=[-3,4,7,10,13,21,43,77,89]
 find_num=8
 
 def binary_search(find_num,l):
	 print(l)
	 if len(l) == 0:
		 print('找的值不存在')
		 return False
		 
	 mid_index=len(l) // 2
	 if find_num > l[mid_index]:
		 l=l[mid_index+1:] #接下来的查找应该是在列表的右半部分
		 return binary_search(find_num,l)

	 elif find_num < l[mid_index]:
		 l=l[:mid_index]  #接下来的查找应该是在列表的左半部分
		 return binary_search(find_num,l)

	 else:
		 print('find it')
		 return True

 res=binary_search(7,nums)
 print(res)

 def salary(n): # n = 3
	 if n==1:
		 return 5000

	 res=salary(n-1)+1000 # 6000 + 1000
	 return res

 res=salary(4) 
 	 salary(4)=salary(3)+1000
			   salary(3)=salary(2)+1000
						 salary(2)=salary(1) + 1000
								   salary(1)=5000
posted @ 2021-12-04 23:26  maju  阅读(33)  评论(0)    收藏  举报