递归函数与fibonacci

1.递归函数

1.1来个例子

1 def f(n):
2     if n == 1:
3         return 1
4     return n * f(n-1)
5 print(f(5))

结果为:120 即5的阶乘

通过这个例子来看递归函数有着两个特点

(1)调用自己

(2)结束条件(在赋值最后一项的时候同时shutdown)

2.fibonacii数列

fibonacci数列形式 0 1 1 2 3 5 8 13 21 34.。。。

2.1函数实现

1 def fibo(n):
2     if n <= 1:
3         return n
4     return fibo(n-1)+fibo(n-2)
5 print(fibo(5))

这里的数列是从第0项开始算的,所以第五项是5

2.2循环实现

1 a = 0
2 b = 1
3 for i in range(8):
4     b,a = a+b,b
5     # c = b
6     # b =a +b
7     # a = c
8 print(b)

上述代码中的

b,a = a+b,b

不是在先赋值b再赋值a的意思而是转换过程相当于注释中的内容。

2.3递归效率

递归函数相当于1000辆车在高速上堵车,第一辆车在抛锚的时候必须等到第一千辆车停止才会修好。而结果出来的时候相当于第一千辆车在此启动的时候。

3.重要的内置函数

3.1filter

1 a = ["d","dd","s"]
2 def f(s):
3     if s != "s":
4         return s
5 ret = filter(f,a)
6 print(ret)

结果为

1 <filter object at 0x000002092077F470>
2 [‘d‘, ‘dd‘]

可以看到返回值为一个filter object的类型,是一个可迭代器,显示需要转换类型或者遍历。

3.2map

1 a = ["d","dd","s"]
2 def f2(s):
3     return s + "gagaga"
4 ret2 = map(f2,a)
5 print(ret2)
6 print(list(ret2))

结果为

<map object at 0x00000277FBDCF470>
[‘dgagaga‘, ‘ddgagaga‘, ‘sgagaga‘]

3.3reduce

1 from functools import reduce
2 def ji(x,y):
3     return x + y
4 print(reduce(ji,range(1,101)))

结果

5050 实现的结果是前100项的和。注意这里reduce返回的值是一个数。运算模式相当于将前两个数处理结果和下一个数处理。

3.4lambda

1 print(list(map(lambda x:x*x,[1,2,3,4])))

结果为

[1,4,9,16]

lambda是一个匿名函数,即没有名字。存在的意义在你想做一件很简单的操作但是用函数太麻烦,就利用lambda做成一行避免污染内存。

1 a = lambda x,y:x*y
2 print(a(2,3))

此段代码明显地表明了lambda是一个函数

时间: 2024-08-13 16:18:34

递归函数与fibonacci的相关文章

Javascript函数式编程要掌握的知识点讲解

一:理解call和apply 及arguments.callee ECMAScript3给Function的原型定义了两个方法,他们是Function.prototype.call 和 Function.prototype.apply. 其实他们的作用是一样的,只是传递的参数不一样而已: 1. apply; 接受2个参数,第一个参数指定了函数体内this对象的指向,第二个参数为一个类似数组的集合,比如如下代码: var yunxi = function(a,b){ console.log([a,

几年前做家教写的C教程(之三专讲了递归和斐波那契)

C语言学习宝典(3) 数组: 一维数组的定义: 类型说明符  数组名[常量表达式] 例如: int  a[10]; 说明:(1)数组名的命名规则和变量名相同,遵循标示符命名规则 (2)在定义数组时需要指定数组个数,即数组长度 (3)变量表达式中可以包括常量和符号常量,不能包含变量. 一维数组的应用:  数组名[下标] 一维数组的初始化:(1)在定义数组时对数组元素赋予初值 Int a[10]={0,1,2,3,4,5,6,7,8,9} (2)可以只给一部分元素赋值 Int a[10]={0,1,

Web Worker无阻塞UI的牛逼技术,html5,可惜无法敢于UI

众所周知,JavaScript是单线程的,JS和UI更新共享同一个进程的部分原因是它们之间互访频繁,但由于共享同一个进程也就会造成js代码在运行的时候用户点击界面元素而没有任何响应这样的情况,这么糟糕的用户体验HTML5怎么会不修订了,这样Web Worker诞生了. Web Worker进程加载的js运行的时候不仅不会影响浏览器UI,而且也不会影响其它Web Worker进程加载的JS代码.由于Web Worker进程加载的js运行的时候不会影响浏览器UI,也就说明Web Worker中加载的

JavaScript 使用函数实现“历史记录”

函数可以使用对象去记住先前操作的结果,从而避免多余的运算. 比如我们现在测试一个费波纳茨算法,我们可以使用递归函数计算fibonacci数列,一个fibonacci数字是之前两个fibonacci数字之和,最前面的两个数字是0和1.代码如下: var count = 0; //记录函数调用次数 var fibonacci = function(n) { count++; return n < 2 ? n : fibonacci(n-1) + fibonacci(n-2); }; for(var

C++函数部分总结

目录 为什么要使用函数 为什么要用函数重载 C++传参方式 特殊的函数--递归函数 为什么要使用函数 使用函数可以将一个比较复杂的程序系统的分为若干块简洁的模块,使程序更加清晰明了 比如,我们想要模拟一个栈,我们的入栈,出栈,判空等操作可以封装在push(),pop(),empty()中,可以更加清晰明了的了解到每一步的操作,易于理解程序. 函数可以将一个重复出现的操作定义为一个模块,通过简单的函数名,简单的参数来调用实现这一功能,使结构化的程序设计更加便捷,易于实现 //例如对于我们的程序需要

关于JS递归函数细化认识及实用实例

程序调用自身的编程技巧称为递归( recursion). 一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量.递归的能力在于用有限的语句来定义对象的无限集合.用递归思想写出的程序往往十分简洁易懂. 一般来说,递归需要有边界条件.递归前进段和递归返回段.当边界条件不满足时,递归前进:当边界条件满足时,递归返回. 注意: (1)

递归函数初探讨

什么是递归? 所谓的递归 ,就是函数自己直接或者间接的调用自己.复杂算法通常比较容易使用递归实现 从前有座山,山里有座庙,庙里有个老和尚讲故事,从前有座山,山里有座庙,庙里... 这个故事就是现实中递归的一个例子,循环往复,生生不息. 以下就是递归函数最简单的一个例子 function foo(n){ return n + foo(n-1); } foo(); 递归中最重要的就是如何跳出循环,因为只有程序跳出了才有结果.如果定义错误,或者缺少终结条件 可导致冻结用户界面 递归的思想:划归思想 递

PHP之递归函数

https://www.cnsecer.com/4146.html http://www.jb51.net/article/71424.htm //一列数字的规则如下:1,1,2,3,5,8,13,21,34........ 求第30位数字是多少function Fibonacci($n) { $result = 1;//当n<=2时都返回1 if($n>2) //当n>2时,进行递归计算 { $result= Fibonacci($n-1)+Fibonacci($n-2); } ret

fibonacci数列的两种求解方式:基础递归VS动态规划

/* * 基础解法,按照递归方法求解,该算法的运算时间是指数级增长的 * 这种算法对于相似的子问题进行了重复的计算,因此不是一种高效的算法 */ public class FibonacciRecursion { //-----------计算Fibonacci数列值的递归函数-------------- public static int fib(int n){ if(n==1||n==2){//序列中第1,2个数为1 return 1; } return fib(n-1)+fib(n-2);