首页 > 其他分享 >一行return 写一个递归函数! 20240414

一行return 写一个递归函数! 20240414

时间:2024-04-14 23:24:33浏览次数:42  
标签:return 函数 递归函数 factorial reduce anonymous 阶乘 20240414 lambda

def make_anonymous_factorial():
return lambda n: 1 if n == 0 else reduce(lambda x, y: x * y, range(1, n + 1))

这个函数 make_anonymous_factorial 的目的是创建并返回一个匿名函数(也称为 lambda 函数),该匿名函数能够计算一个给定非负整数 n 的阶乘。下面是对这个函数的详细分析:

  1. make_anonymous_factorial 函数没有参数。它返回一个 lambda 函数,这个 lambda 函数接受一个参数 n

  2. 返回的 lambda 函数使用 reduce 函数来计算阶乘。reduce 函数是 functools 模块中的一个函数,它将一个函数(在这里是一个 lambda 函数)累积地应用于一个序列的所有元素,从而得到一个单一的输出值。

  3. reduce 函数的第一个参数是一个 lambda 函数,它接受两个参数 xy,并返回它们的乘积 x * y。这个 lambda 函数的作用是将两个数字相乘。

  4. reduce 函数的第二个参数是 range(1, n + 1),它生成一个从 1 到 n(包括 n)的整数序列。这个序列用于计算阶乘,因为阶乘是这些数字的乘积。

  5. reduce 函数的第三个参数是 1,这是初始累积值。在计算阶乘时,初始累积值设置为 1 是有意义的,因为任何数和 1 相乘都等于它本身。

  6. make_anonymous_factorial 被调用时,它返回一个计算阶乘的 lambda 函数。当你随后调用这个 lambda 函数并传入一个非负整数 n 时,它将计算并返回 n 的阶乘。

这个函数的实现满足了题目中的约束条件,即不使用任何赋值操作、递归或定义新的函数(除了匿名函数)。然而,需要注意的是,reduce 函数和 lambda 表达式在这里的使用可能会让人觉得有些冗余,因为我们可以直接使用一个循环或者迭代器来计算阶乘,从而避免使用 reduce 函数。

下面是一个使用迭代器来计算阶乘的更简洁的实现:

def make_anonymous_factorial():
return lambda n: 1 if n == 0 else reduce(lambda x, y: x * y, range(1, n + 1))

在这个实现中,我们添加了一个条件表达式来处理 n 为 0 的情况,因为 0 的阶乘是定义为 1 的。这样,当 n 为 0 时,lambda 函数将直接返回 1,而不是尝试计算一个空序列的乘积,这可能会导致 reduce 函数抛出异常。

标签:return,函数,递归函数,factorial,reduce,anonymous,阶乘,20240414,lambda
From: https://www.cnblogs.com/landboat/p/18134898

相关文章

  • Python教程:return和yield的区别
    return一直中,每中语言中其没没有很大差别,就不多说了。(shell语言return的是退出状态,可能差别是比较大的)最早看到yield应该是哪们语言用来调整什么线程优先级的,记不清了,不过那里的yield和python中的yield应该功能有区别。一、return和yield的异同共同点:return和yield都用来返回值......
  • C#中continue、return、break的区别及作用
    continue、return、break是三个非常重要的关键字,可以用于控制程序流程,分别对应于跳过循环迭代、终止函数执行返回结果、跳出循环结构。continue语句:用于跳过循环中的某些迭代,直接执行下一次循环。经常在for循环和while循环中使用。for(inti=0;i<6;i++){if(i4){continue;......
  • springBoot AOP 深入原理,及 @Before,@Around,@After,@AfterReturn,@AfterThrowing执行
    连接点(Joinpoint):程序能够应用通知的一个“时机”,这些“时机”就是连接点,例如方法被调用时、异常被抛出时等等。——可以理解为被aop拦截的类或者方法就是连接点。通知(Advice):通知定义了切面是什么以及何时使用。描述了切面要完成的工作和何时需要执行这个工作。——可以理解为被......
  • dbt return macro 内部实现简单说明
    jinja2默认是没有returnmacro的,dbt在实现的时候比较有意思,通过一个exception触发的,以下是简单说明参考使用一个包含return的macro{%macrodemoapp(name,version)%}{%ifversion=='v1'%}{{return("appdemo")}}{%else%}......
  • Python 递归函数实现二分法,带思路解释
            二分法可以大大提升对有序数列的查找,传统的迭代查找会挨个比较数列中的值,如果数列较为庞大会影响查询效率。二分法每次取数列的中间数与待查找数字比较大小,以升序排列为例子 首先要考虑数列长度的奇偶性。        奇数取中间位置的数字,如果比待查找......
  • dfs的return时机问题
    题目链接错误代码的\(dfs\)方式:voiddfs(intu,intcnt){if(u==n)return;if(n-u+cnt<m)return;if(cnt==m)//再往下dfs没有意义了,剪枝{dp();return;}dfs(u+1,cnt);del[u]=tru......
  • [计算理论] 1. 图灵机、递归函数与丘奇-图灵论题 Turing Machine, Recursive Function
    图灵机在研究一种自动机时,我们有两种视角语法学(Syntax),描述一个自动机是什么,如分析自动机的组成、结构。语义学(Semantics),描述一个自动机做什么,如分析自动机的语言。换句话说,前者是自动机的视角,后者是形式语言的视角。图灵机的语法图灵机的原始描述如下:一台含......
  • 递归函数-树形列表
    基本思想根据根节点没有父节点原理找到父节点;根据子节点的父id找到根节点所有的子节点;递归遍历父节点的所有子节点; privatevoidrecursionFn(List<SysDept>list,SysDeptt){//得到子节点列表List<SysDept>childList=getChildList(list,t......
  • [Rust] Using Box<dyn error::Error>> return one of miultiple error types at runti
    usestd::error;usestd::fmt;usestd::num::ParseIntError;fnmain()->Result<(),Box<dynerror::Error>>{letpretend_user_input="42";letx:i64=pretend_user_input.parse()?;println!("output={:?}",Po......
  • 从__builtin_eh_return看callee saved register
    问题C++的异常处理看起来是一个比较神奇的功能,能够在运行时穿越堆栈,从异常发生位置直达异常处理位置。通过gcc的代码可以看到,这个堆栈回溯的一个关键步骤是这个宏,其中又使用了gcc的内置指令__builtin_eh_return。网上关于__builtin_eh_return这个内置函数的资料较少,结合gcc的源代......