递归

Python学习笔记:函数和变量详解

半城伤御伤魂 提交于 2020-04-07 12:31:40
  一、面向对象:将客观世界的事物抽象成计算机中的数据结构 类:用class定义,这是当前编程的重点范式,以后会单独介绍。二、函数编程:逻辑结构化和过程化的一种编程方法 1、函数-->用def定义 2、好处: a、重用逻辑 b、保持一致性:改一个地方,其他调用的地方都会改 c、可扩展性 注意:可复用的逻辑一定要用函数写 3、函数的返回值: a、返回多个值,Python会将多个值装到元组中返回 b、返回1个值,则返回一个object c、无返回值,则Python默认返回None三、函数的参数:  1、实参:即实际参数,是在调用时传递给函数的参数,必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。   2、形参:即形式参数,形参是函数被调用时用于接收实参值的变量。  3、位置参数,与形参的位置一对一对应,比如:test(4,5)  4、关键字参数,无需位置一对一对应,比如:test(x,y),调用的时候也可以写成test(y=5,x=4),因为有指定关键词,所以无需按顺序写  5、位置和关键词调用混合时:关键词参数不能写在位置参数前面,比如:     def test(x, y, z):     print("%d %d %d" % (x, y, z))    x = 1    y = 2    z = 3    test(x, y, z) #

矩阵乘法递归求解

两盒软妹~` 提交于 2020-04-07 09:01:31
给定两个N×N的矩阵,求乘积 如下图所示,乘法执行过程如下: 1.矩阵1先拿出一行,矩阵2先拿出一列 2.行与列相乘得到value1 3.行与剩下矩阵2相乘得到value2(递归过程) 4.剩下矩阵1与列相乘得到value3(递归过程) 5.剩下矩阵1与剩下矩阵2相乘得到value4(递归过程) 6.将value1~value4合并成结果数组 写代码时注意约定,value1一定是数值,value2、value3、value4是数值、空数组或者非空的二维数组 由php实现,大体思路不难,但是要非常注意合并结果的细节: 1 <?php 2 3 class MatrixProduct 4 { 5 protected $matrix1, $matrix2; 6 protected $result; 7 8 public function __construct($matrix1, $matrix2) 9 { 10 $this->matrix1 = $matrix1; 11 $this->matrix2 = $matrix2; 12 $this->result = $this->matrixProduction($this->matrix1, $this->matrix2); 13 } 14 15 public function show() 16 { 17 foreach ($this-

简单的递归加载树形菜单

≯℡__Kan透↙ 提交于 2020-04-07 08:47:32
由于之前只做个2级的菜单加载的编写,前段时间一直在考虑怎么用递归来完成无限级加载,(一直对递归有点陌生,之前很少用的缘故),今天通过了解递归和自己的摸索,基本算是完成了,其实代码很简单,希望各位大牛勿拍砖啊, public static void MenuLoad() { var data = _list.Where(t => t.ParentId == 0); foreach (var tree in data) { Console.WriteLine(tree.Name); AddChildNode(tree.Id); } } public static void AddChildNode(int id) { var data = _list.Where(t => t.ParentId == id); foreach (var tree in data) { Console.WriteLine(tree.Name); AddChildNode(tree.Id); } }    来源: https://www.cnblogs.com/guobingbing/p/3735868.html

递归与尾递归

假如想象 提交于 2020-04-06 23:54:02
下面两个程序是scheme写的计算阶乘的递归和尾递归实现 线性递归: (define (factorial n) (if (=n 1) 1 (* n (factorial (- n 1))))) 尾递归: (define (factorial n) (fact-iter 1 1 n)) (define (fact-iter product counter max-count) (if (> counter max-count) product (fact-iter (* counter product) (+ counter 1) max-count))) 用C写出来就是这样的: 线性递归: long factorial(long n) { return(n == 1) ? 1 : n * factorial(n - 1); } 尾递归: long fact_iter(long product, long counter, long maxcount) { return (counter > maxcount) ? product : fact_iter(product*counter, counter+1, maxcount); } long factorial(long n) { return fact_iter(1, 1, n); } 线性递归程序基于阶乘的递归定义,即

【Python学习笔记】递归函数

余生颓废 提交于 2020-04-06 21:50:38
★特殊的一种函数——递归函数 通常,函数是靠调用其他函数完成自己的功能的,但是还存在一种调用方式是:函数调用它自身,这样的函数称为递归函数 递归函数是利用'栈'实现的,递归函数的优点是定义简单,逻辑清晰,缺点是比较占用资源,且容易造成栈溢出,甚至导致崩溃 # 常见的递归函数是计算阶乘 def fact(n): if n==1: return 1 return n * fact(n - 1) print fact(5) 运行效果: # 理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。 # ★★★如非必须,尽量不用递归函数★★★ #每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。 # print fact(1000) # 报错 # 解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。 # 尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况# # 使用尾递归优化的计算阶乘 def fact(n): return fact_iter(n, 1) def fact_iter

如何递归计算目录中的所有代码行?

我只是一个虾纸丫 提交于 2020-04-06 15:07:50
问题: We've got a PHP application and want to count all the lines of code under a specific directory and its subdirectories. 我们有一个PHP应用程序,并希望计算特定目录及其子目录下的所有代码行。 We don't need to ignore comments, as we're just trying to get a rough idea. 我们不需要忽略评论,因为我们只是想弄清楚。 wc -l *.php That command works great within a given directory, but ignores subdirectories. 该命令在给定目录中运行良好,但忽略子目录。 I was thinking this might work, but it is returning 74, which is definitely not the case... 我当时认为这可行,但它正在返回74,绝对不是这样...... find . -name '*.php' | wc -l What's the correct syntax to feed in all the files? 提供所有文件的正确语法是什么? 解决方案: 参考一:

尾递归 优化

时光毁灭记忆、已成空白 提交于 2020-04-06 02:56:40
由尾递归优化后的函数可以知道,每一次调用函数自身,都会将更新后的初始值和最终的结果传递进去,通过回溯来求得最终的结果。 来源: oschina 链接: https://my.oschina.net/u/4004801/blog/3215705

Google的面试题长啥样?看完被吊打!

那年仲夏 提交于 2020-04-06 02:19:00
本文翻译自Google工程师/面试官Alex Golec的文章:Google Interview Questions Deconstructed: The Knight’s Dialer; 来源:实验楼,翻译:实验楼扫地阿姨 原文: https://medium.com/@alexgolec/google-interview-questions-deconstructed-the-knights-dialer-f780d516f029 作为一名Google的工程师和面试官,今天是我第二次发文分享科技公司面试建议了。 这里先声明:本文仅代表我个人的观察、意见和建议。请勿当作来自Google或Alphabet的官方建议或声明。 **下面这个问题,是我面试生涯中第一个问题;也是第一个被泄漏出来,以及第一个被禁掉的问题。**我喜欢这个问题,因为它有以下优点: 问题很容易表述清楚,也容易理解。 这个问题有多个解。每个解都需要不同程度的算法和数据结构知识。而且,还需要一点点远见。 每个解都可以简单几行代码实现,非常适合有时间限制的面试。 如果你是学生,或者求职者,我希望你通过本文能够了解到,面试问题一般会是怎么样的。如果你也是面试官,我很乐意分享自己在面试中的风格和想法,如何更好地传达信息、征求意见。 **注意,**我将使用Python写代码;我喜欢Python因为它易学,简洁

函数递归调用

不想你离开。 提交于 2020-04-06 00:25:33
基本介绍: 一个函数在函数体内又调用了本身,我们称为递归调用 代码1: package main import ( "fmt" ) func test(n int) {   if n > 2 {     n--     test(n)   }   fmt.Println("n=", n) } func main() {   test(4) } 上面代码的内存分析图: 代码2: func test2(n int) {   if n > 2 {     n--     test2(n)   } else {     fmt.Println("n=", n)   } } func main() {   test2(4) } 对上面代码分析的示意图: 函数递归需要遵守的重要原则: 1)执行一个函数时,就创建一个新的受保护的独立空间(新函数栈) 2)函数的局部变量是独立的,不会相互影响 3)递归必须向退出递归的条件逼近,否则就是无限递归,死龟了:) 4)当一个函数执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁。同时当函数执行完毕或者返回时,该函数本身也会被系统销毁。 练习题: 题1: 斐波那契数 请使用递归的方式,求出斐波那契数1,1,2,3,5,8,13... 给你一个整数n,求出它的值是多少? 思路:   1)当 n == 1 || n == 2,返回1   2

return 和 方法的递归调用

♀尐吖头ヾ 提交于 2020-04-06 00:14:36
return语句直接结束方法 方法的递归调用: 递归调用是一种特殊的调用形式,是方法自己调用自己,如图所示: 例子:完成数字的累加操作,除了循环操作以外还可以使用递归调用: 代码: package WordCount; public class DiGui { public static void main(String[] args) { System.out.println("计算结果:" + sum(100)); // 调用操作 } public static int sum(int num) { if (num == 1) { return 1; } else { return num + sum(num - 1); // 递归调用 } } } 结果:   计算结果:5050 分析:用System.out.println("计算结果:" + sum(100));给sum方法传递一个参数为100的参数, 还可以残敌一个1的参数,让num=100的时候return, 注意: 递归调用在操作时如果处理不好,则有可能出现内存溢出。 来源: https://www.cnblogs.com/bokun-wang/archive/2011/11/30/2268799.html