递归算法
什么是递归?
- 在数学与见算计科学中,是指在函数的定义中使用函数自身的方法。
- 递归算法就是一种直接或者间接的调用自身函数或者方法的算法
- 递归算法的实质是把问题分解规模小的同类问题的子问题
- 然后调用自身方法来解
递归的基本原理
- 每一级的函数调用都有自己的变量
- 每一次函数调用都会有一次返回
- 递归函数中,位于递归调用前的语句和各级被调用函数具有相同的执行顺序
- 递归函数中,位于递归调用后的语句的执行顺序和各个被调用函数的顺序相反
- 虽然每一级递归都有自己的变量,但是函数的代码不会得到复制
递归的优缺点
优点
缺点
- 递归调用,占用空间大
- 递归太深,容易发生栈溢出
- 可能存在重复计算
递归的三大要素
- 明确函数要做什么
- 寻找递归结束条件
- 找出函数的等价关系式
python对递归的使用
解决最大递归深度
1 2 3
| import sys
sys.setrecursionlimit(3000)
|
高斯求和
1 2 3 4 5 6 7 8 9 10
| def count_number(n): if n <= 0: return 0 return n + count_number(n-1) def count_Number2(n): sum = 0 for i in n: sum += i return sum
|
斐波那契
1 2 3 4 5 6 7
| def fn(n): if n == 1: return 1 else if n ==2: return 1 else: return fn(n-1)+fn(n-2)
|
无限级评论
[{},{},{},{},{}]
[{ “child”: {“child”:[ {} , {} ] } }, {id:5, child:[{ child:[{}],{}] } ]
django将数据封装为树结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| def change_comments(data): list = [] tree = {} root = '' p_id = ''
for i in data: tree[i["id"]] = i
for i in data: if i["p_id"] == None: root = tree[i["id"]] list.append(root) else: p_id = i["p_id"] if "childlist" not in tree[p_id]: tree[p_id]['childlist'] = [] tree[p_id]["childlist"].append(tree[i["id"]])
return list
|
vue使用父子组件递归展示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <!-- zizujian.vue -->
<template> <div> <li>{{data.content}} <ul v-if="data.childlist && data.childlist.length>0"> <zi v-for="i in data.childlist" :key="i.id" :data="i" /> </ul> </li> </div> </template>
<script> export default { name:"zi", props:["data"] } </script>
<style> ul{ list-style: none; /* padding-left: 20px */ }
</style>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| <!-- fuzujian.vue -->
<template> <div> <zi :data="data" /> <!-- <zizujian :data="data" /> --> </div> </template>
<script> import zi from './zi' import axios from 'axios'
export default { name:"showzi", data() { return { data:'' } }, components:{ zi }, methods:{ get_info(){ axios.get("http://127.0.0.1:8000/comment/com/").then(res=>{ var mytree = {"id":0,"content":""} mytree["childlist"] = res.data.data this.data= mytree // this.data= res.data.data // console.log(this.data) }) } }, created(){ this.get_info() } } </script>
|