首页 > 其他分享 >函数递归

函数递归

时间:2023-07-09 09:44:18浏览次数:31  
标签:调用 return 函数 递归 累加 num 深度

 

 

 1 '''
 2 函数的递归即函数调用自己
 3 最佳实践:
 4     1. 定义基本情况(终止条件): 递归函数应该始终包含一个或多个基本情况,即终止条件。这些基本情况描述了递归的结束条件,当满足这些条件时,递归将停止并返回结果。
 5     2. 确保向基本情况收敛: 确保递归过程能够向基本情况无限接近,并最终收敛。如果递归没有向基本情况收敛,会导致无限递归,最终耗尽系统资源并引发错误。
 6     3. 传递必要的参数: 在每次递归调用中,确保传递必要的参数以便递归正确执行。参数的值应该在递归的不同层级中改变以推进问题的解决。
 7     4. 利用递归的结果: 在递归函数中合理利用递归的结果来构建最终的返回值。通常可以通过将递归结果与当前步骤的计算结果结合来获得所需的最终结果。
 8 
 9 需要注意的坑:
10     1. 缺少或错误的终止条件: 如果没有正确定义基本情况(终止条件),递归将无法结束,导致无限递归并耗尽系统资源。确保定义了满足停止递归的基本情况。
11     2. 递归层数过多: Python默认递归深度有限。如果递归的层数超过了Python的递归限制,将引发RecursionError。如果需要处理大量的递归,可能需要考虑使用其他方法,如迭代或动态规划。
12     3. 重复计算: 在递归函数中,如果没有适当地利用递归的结果,可能会导致重复计算相同的值,从而浪费时间和资源。确保适当地利用递归的结果以避免重复计算。
13     4. 栈溢出: 递归函数在每次递归调用时都会创建一个新的函数帧并将其推入调用栈中。如果递归层数过多,可能导致调用栈溢出并引发RecursionError。确保递归不会达到系统的调用栈限制。
14 '''
15 
16 
17 def factorial(n):
18     ''' n 表示要求的数的阶乘 '''
19     if n == 1 or n == 0:
20         return 1
21     else:
22         return n * factorial(n - 1)  # 返回结果
23 
24 
25 print(factorial(5))
# 需求:3以内数字累加和 3 + 2 + 1 = 6
# 6 = 3 + 2以内数字累加和
# 2以内数字累加和 = 2 + 1以内数字累加和
# 1以内数字累加和 = 1  # 出口


# 递归特点:函数内部自己调用自己;必须有出口


def sum_numbers(num):
    # 2. 出口
    if num == 1:
        return 1
    # 1. 当前数字 + 当前数字-1的累加和
    return num + sum_numbers(num-1)


result = sum_numbers(3)
print(result)

# 如果没有出口,报错:超出最大递归深度

 

 

 

在Python中,默认的递归深度限制是1000层。这意味着,如果递归调用的层数超过了1000层,将引发RecursionError异常。

可以通过sys.setrecursionlimit()函数来更改默认的递归深度限制。例如,要将递归深度限制增加到2000层,可以使用以下代码:

1 import sys
2 
3 sys.setrecursionlimit(2000)

需要注意的是,更改递归深度限制可能会影响程序的性能和内存使用情况。如果需要处理大量的递归或者递归深度很大,建议考虑其他解决方案,如迭代或动态规划,以避免栈溢出或性能问题。

 

标签:调用,return,函数,递归,累加,num,深度
From: https://www.cnblogs.com/allenxx/p/17538336.html

相关文章

  • 函数的变量作用域、返回值、参数
    函数的变量作用域以及访问、修改全局变量1'''2函数往往涉及2类变量:31.全部变量,直接访问,修改需要使用global关键字42.局部变量,函数内部定义的变量5'''67#1.全局变量8name='Allen'91011#1.1定义函数12defprint_name():13p......
  • 小程序函数全集封装
    /***Createdbyzrs*/importVuefrom'vue'/***json拼接为字符串*@paramjson*@returns{string}*/exportfunctionqs(json){letstr=''for(letkeyinjson){if(json.hasOwnProperty(key)){str+=key+'......
  • R语言中 table函数统计不了NA
     001、vec2<-c(3,NA,6,5,NA,NA,8,9,NA,4,7,8)##测试向量vec2table(vec2)vec2table(vec2,useNA="always")##统计NA,增加参数useNA="always".  ......
  • python - 函数(二)
    4.传递列表defgreet_users(names):"""向列表中的每位用户发出问候。"""fornameinnames:msg=f"Hello,{name.title()}"print(msg)usernames=['hanks','jackson','jimmy']......
  • python - 函数(一)
    1.示例defgreet_user():#函数定义"""显示简单的问候语"""#文档字符串,描述了函数的功能。Python基于此生成有关函数的文档print("Hello!")greet_user()1.1参数defgreet_user(username):"""显示简单的问候语"&......
  • reactive函数
    作用:定义一个对象类型的响应式数据(基本类型不要用它,要用ref函数)语法:const代理对象=reactive(源对象)接收一个对象(或数组),返回一个代理对象(Proxy的实例对象,简称proxy对象)reactive定义的响应式数据是“深层次的”。内部基于ES6的Proxy实现,通过代理对象操作源对象......
  • R语言中 bquote函数
     R语言中bquote函数用于显示变量的值,有点类似与shell中的$符号。001、i=100##定义一个测试变量bquote(i)##不能直接输出变量的值bquote(.(i))##需要借助.()的形式输出变量的值 002、应用于绘图中i=100plot(1:10,mai......
  • ref函数
    作用:定义一个响应式的数据语法:constxxx=ref(initValue)创建一个包含响应式数据的引用对象(reference对象,简称ref对象)。JS中操作数据:xxx.value模板中读取数据:不需要.value,直接:<div>{{xxx}}</div>备注:接收的数据可以是:基本类型、也可以是对象类型。......
  • 函数定义、调用、闭包
    函数的语法及调用步骤函数是直接在模块/py文件中定义的,与类方法、实例方法有区别。1'''2一、函数的语法:3deffunction_name(parameter1,parameter2,...):4"""函数文档字符串"""5#函数体代码块6#...7returnvalue#可选的返回值8......
  • 博弈论之SG函数 学习笔记
    在许多地方曾经行过这样一个小游戏,摆出三堆硬币。分别包含3枚、5枚、7枚。两人轮流行动每次可以任选一堆,从中取走任意多枚硬币,可把一堆取完,但不能不取。取走最后一枚硬币者获得胜利。这类游戏可以推广为更加一般的形式:给定\(n\)堆物品,第\(i\)堆物品有\(A_i\)个。两名玩......