递归算法与项目实战 学习记录
2023-12-21 16:17:09
# This is a sample Python script. import sys # Press Shift+F10 to execute it or replace it with your code. # Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings. # def to_str(n, base): # convert_string = "0123456789ABCDEF" # if n < base: # return convert_string[n] # else: # return to_str(n//base, base) + convert_string[n % base] # frthonds3.basic import Sta # import turtle # # def draw_spiral(my_tutle, line_len): # if line_len > 0: # my_tutle.forward(line_len) # my_tutle.right(90) # draw_spiral(my_tutle, line_len-50) # # # my_turtle = turtle.Turtle() # my_win = turtle.Screen() # draw_spiral(my_turtle, 100) # my_win.exitonclick() # 用递归调用实现指数函数 # def exponentByIteration(a, n): # result = 1 # for i in range(n): # result *= a # return result # # print(exponentByIteration(3, 6)) # def exponentByRecursion(a, n): # if n == 1: # return a # elif n % 2 == 0: # result = exponentByRecursion(a, n // 2) # return result * result # elif n % 2 == 1: # result = exponentByRecursion(a, n // 2) # return result * result * a # # print(exponentByRecursion(3, 6)) # 解释了用递归调用比用迭代调用性能高的多 # 每个递归算法都可以转换成等效的迭代算法,根据递归算法提供的思路,实现另一种迭代式的指数计算函数 # 本质上将需要计算的一系列操作存到了列表中 # def exponentWithPowerRule(a, n): # # 第一步判断需要执行的是什么运算 # opStack = [] # while n>1: # if n % 2 == 0: # opStack.append("square") # n = n//2 # elif n % 2 == 1: # n -= 1 # opStack.append("multiply") # # 第二步, 按照逆序依次执行这些计算 # result = a # while opStack: # op = opStack.pop() # # if op == "multiply": # result *= a # elif op == "square": # result *= result # return result # print(exponentWithPowerRule(3, 6)) # 2023/12/19 递归法实现反转字符串 # def rev(theString): # if len(theString) == 0 or len(theString)==1: # # 基本情况 # return theString # else: # head = theString[0] # tail = theString[1:] # return rev(tail) + head # print(rev("dc_lover")) # 递归法 判断回文字符串 # def isPalindrome(theString): # if len(theString) == 0 or len(theString) == 1: # return True # else: # head = theString[0] # middle = theString[1:-1] # last = theString[-1] # return head == last and isPalindrome(middle) # print(isPalindrome("dc_loverrevol_cd")) # print(isPalindrome("zophie")) # 树的前序遍历 # root = {'data':'A', 'children': [{'data':'B', 'children': # [{'data':'D','children':[]}]}, {'data':'C', 'children': # [{'data':'E','children':[{'data':'G','children':[]}, # {'data':'H','children':[]}]}, {'data':'F','children':[]}]}] } # # def preorderTraverse(node): # print(node['data'], end='') # if len(node['children']) > 0: # for child in node['children']: # preorderTraverse(child) # return # preorderTraverse(root) # 前序遍历和创建这颗树的顺序好像一样 # 树的后序遍历 # root = {'data':'A', 'children': [{'data':'B', 'children': # [{'data':'D','children':[]}]}, {'data':'C', 'children': # [{'data':'E','children':[{'data':'G', 'children':[]}, # {'data':'H','children':[]}]}, {'data':'F', 'children':[]}]}]} # # def postorderTraverse(node): # for child in node['children']: # postorderTraverse(child) # print(node['data'], end='') # return # postorderTraverse(root) # root = {'name': 'Alice', 'children': [{'name': 'Bob', 'children': # [{'name': 'Darya', 'children': []}]}, {'name': 'Caroline', # 'children': [{'name': 'Eve', 'children':[{'name':'Gonzalo', # 'children':[]}, {'name':'Hadassah', 'children':[]}]}, {'name':'Fred','children':[]}]}]} # # def find8LetterName(node): # print('Visiting node' + node['name'] + '...') # # print("checking if " + node['name'] + ' is 8 letters...') # # 这里是基本情况 # if len(node['name']) == 8: # return node['name'] # # # 该条判断语句的作用是 判定当前节点存在子树 # if len(node['children']) > 0: # for child in node['children']: # returnValue = find8LetterName(child) # if returnValue != None: # return returnValue # # return None # # print(str(find8LetterName(root))) # root = {'data':'A', 'children': [{'data':'B', 'children': # [{'data':'D','children':[]}]}, {'data':'C', 'children': # [{'data':'E','children':[{'data':'G','children':[]}, # {'data':'H','children':[]}]}, {'data':'F','children':[]}]}] } # # # def getDepth(node): # if len(node['children']) == 0: # return 0 # else: # maxChildDepth = 0 # for child in node['children']: # childDepth = getDepth(child) # if childDepth > maxChildDepth: # maxChildDepth = childDepth # return maxChildDepth + 1 # # print(getDepth(root)) # 递归算法实现二分 # def binarySearch(needle, haystack, left=None, right=None): # if left is None: # left = 0 # if right is None: # right = len(haystack)-1 # # if left > right: # return None # mid = (left+right)//2 # if needle == haystack[mid]: # return mid # elif needle < haystack[mid]: # return binarySearch(needle, haystack, left, mid-1) # elif needle > haystack[mid]: # return binarySearch(needle, haystack, mid+1, right) # # print(binarySearch(13, [1,4,8,11,13,16,19,19])) # 快速排序 # def quicksort(items, left=None, right=None): # if left is None: # left = 0 # if right is None: # right = len(items)-1 # # if right <= left: # return # # i = left # pivotValue = items[right] # # for j in range(left, right): # if items[j] <= pivotValue: # items[i], items[j] = items[j], items[i] # i += 1 # # items[i], items[right] = items[right], items[i] # # quicksort(items, left, i-1) # quicksort(items, i+1, right) # # # myList = [0, 7, 6, 3, 1, 2, 5, 4] # quicksort(myList) # print(myList) # 递归的获取全排列 def getPerms(chars, indent=0): # print('.' * indent + 'Start of getPerms ("' + chars + '")') if len(chars) == 1: # print('.' * indent + 'When chars = "'+ chars + '" base case returns', chars) return [chars] permutations = [] head = chars[0] tail = chars[1:] tailPermutations = getPerms(tail, indent+1) for tailPerm in tailPermutations: for i in range(len(tailPerm)+1): newPerm = tailPerm[0:i] + head + tailPerm[i:] # print('.'*indent + 'New permutation:', newPerm) permutations.append(newPerm) return permutations print(getPerms('ABCD'))
文章来源:https://blog.csdn.net/yyfhq/article/details/135126631
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!