“人造太阳”计划

递归与尾递归

假如想象 提交于 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); } 线性递归程序基于阶乘的递归定义,即

动态规划---子序列的个数

天涯浪子 提交于 2020-04-06 00:16:04
子序列的个数 题目详情: 子序列的定义:对于一个序列a=a[1],a[2],......a[n],则非空序列a'=a[p1],a[p2]......a[pm]为a的一个子序列,其中1<=p1<p2<.....<pm<=n。 例如:4,14,2,3和14,1,2,3都为4,13,14,1,2,3的子序列。 对于给出序列a,有些子序列可能是相同的,这里只算做1个,要求输出a的不同子序列的数量。 输入: 长度为n的数组1<=n<=100,数组元素0<=a[i]<=110 输出:子序列 的个数对1000000007取余数的结果(由于答案比较大,输出Mod 1000000007的结果即可)。 函数头部: C/C++: int run(cons int *a,int n); java public static int run(int [] a);   这道题目也是困扰了我很久,一直找不到比较好的方法,这道题目应该是可以用动态规划做出来的,因此我也特地去学习动态规划的思想,并找了一些练习题做,可是这个状态转移方程着实难住我了,本来数学基础一般般,这就更加大了难度。虽然我最终解决了这道题目,可是那是建立在大神指点的情况下做出来的,我在这里只是把题解写出来,顺便裨补阙漏,看看自己的理解是否正确,其实,想和做是两回事,这里也请大家给与指正。 题解:   假设子序列的 前k 个数的子序列个数为 d(k

迭代器和生成器

一曲冷凌霜 提交于 2020-04-04 06:57:31
一、手动访问迭代器中的元素   要手动访问可迭代对象中的元素,可以使用next()函数。 with open('/etc/passwd') as f: try: while True: line = next(f) print(line, end='') except StopIteration: pass with open('/etc/passwd') as f: while True: line = next(f,None) if line is None: break print(line, end='') 二、委托迭代   Python的迭代协议要求__iter__()返回一个特殊的迭代器对象,由该对象实现的__next__()方法来完成实际的迭代。   如果要做的只是迭代另一个容器中的内容,我们不必担心底层细节是如何工作的,所要做的就是转发迭代请求。 class Node: def __init__(self,value): self._value = value self._children = [] def __repr__(self): return 'Node({!r})'.format(self._value) def add_children(self,node): self._children.append(node) def __iter__(self)

C++的标准模板库STL中实现的数据结构之链表std::list的分析与使用

余生长醉 提交于 2020-04-02 08:24:38
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解,即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第二篇。 主要针对线性表中的 链表 STL std::list进行分析和总结 。 引言 因为前段时间对台大的机器学习基石和技法课程进行了学习,发如今详细的实现中经常涉及到各种类型的数据结构,比方线性表、二叉树、图等。在使用这些数据结构时感到有些吃力,主要是对一些主要的数据结构理解的不够,所以趁着暑假假期,近期一段时间总会抽出时间复习一下数据结构, 參考的教材是王立柱编著的《C/C++与数据结构》 ,在详细的应用中採用的是C++标准模板库STL中相应实现的数据结构,主要 參考的是MSDN文档 。 跟着教材的一步一步推进。如今已经复习完了链表一章节。详细的理论能够參看我的博文: http://blog.csdn.net/lg1259156776/article/details/47018813 本次关注点在list模板类的使用。 正文 回想动态数组类 上一篇总结STL vector动态数组类的时候忘记了对还有一种跟vector很类似的动态数组类deque进行说明。 以下对此进行一下补充。 STL deque类须要包括<deque>和使用std。支持在数组的开头和末尾插入或删除元素,而vector仅仅能在末尾插入或删除

C++ map 的用法归纳2

99封情书 提交于 2020-04-02 07:49:02
【尊重原著: http://blog.csdn.net/zcf1002797280/article/details/7847819】 Map是c++的一个标准容器,它提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,总结了一些map基本简单实用的操作! 1. map构造函数; map<string , int >mapstring; map<int ,string >mapint; map<sring, char>mapstring; map< char ,string>mapchar; map<char ,int>mapchar; map<int ,char >mapint; 2. map添加数据; map<int ,string> maplive; 1.maplive.insert(pair<int,string>(102,"aclive")); 2.maplive.insert(map<int,string>::value_type(321,"hai")); 3, maplive[112]="April";//map中最简单最常用的插入添加! 3,map中元素的查找: find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。 map<int ,string >::iterator l_it;; l_it

Python高级特性:迭代器和生成器

一个人想着一个人 提交于 2020-04-01 07:48:54
在Python中,很多对象都是可以通过for语句来直接遍历的,例如list、string、dict等等,这些对象都可以被称为可迭代对象。至于说哪些对象是可以被迭代访问的,就要了解一下迭代器相关的知识了。 迭代器 迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和next()方法。其中__iter__()方法返回迭代器对象本身;next()方法返回容器的下一个元素,在结尾时引发StopIteration异常。 __iter__()和next()方法 这两个方法是迭代器最基本的方法,一个用来获得迭代器对象,一个用来获取容器中的下一个元素。 对于可迭代对象,可以使用内建函数iter()来获取它的迭代器对象: 例子中,通过iter()方法获得了list的迭代器对象,然后就可以通过next()方法来访问list中的元素了。当容器中没有可访问的元素后,next()方法将会抛出一个StopIteration异常终止迭代器。 其实,当我们使用for语句的时候,for语句就会自动的通过__iter__()方法来获得迭代器对象,并且通过next()方法来获取下一个元素。 自定义迭代器 了解了迭代器协议之后,就可以自定义迭代器了。 下面例子中实现了一个MyRange的类型,这个类型中实现了__iter__()方法

python 迭代器与生成器

怎甘沉沦 提交于 2020-03-30 08:11:10
迭代器 迭代式访问元素的一种方式,迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 迭代器有两个基本的方法: iter() 和 next() 。 常见的字符串,列表或元组对象都可用于创建迭代器: >>> list=[1,2,3,4,5] >>> it=iter(list) >>> print(next(it)) 1 >>> print(next(it)) 2 迭代器对象可以使用常规for语句进行遍历: list=[1,2,3,4,5] it = iter(list) # 创建迭代器对象 for x in it: print (x, end=" ") 输出如下: 1 2 3 4 5 也可以使用 next() 函数: import sys # 引入 sys 模块 list = [1, 2, 3, 4] it = iter(list) # 创建迭代器对象 while True: try: print(next(it)) except StopIteration: sys.exit() 输出如下: 1 2 3 4 创建一个迭代器 把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__() 。 如果你已经了解的面向对象编程,就知道类都有一个构造函数,Python

Python3 迭代器

♀尐吖头ヾ 提交于 2020-03-26 15:07:55
3 月,跳不动了?>>> Python3 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式。 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 迭代器 可迭代对象:实现了 __iter__() 方法的对象,它的 __iter__() 方法可以返回一个迭代器对象 迭代器对象:实现了 __next__() 方法的对象,它的_ _iter__() 方法可以返回迭代器对象本身 迭代器有两个基本的方法:iter() 和 next() 字符串,列表或元组对象都可用于创建迭代器: 实例: >>> list=[1,2,3,4] >>> it = iter(list) # 创建迭代器对象 >>> print (next(it)) # 输出迭代器的下一个元素 1 >>> print (next(it)) 2 迭代器对象可以使用常规for语句进行遍历: 实例: #!/usr/bin/python3 list=[1,2,3,4] it = iter(list) # 创建迭代器对象 for x in it: print (x, end=" ") 执行以上程序,输出结果如下: 1 2 3 4 创建一个迭代器 把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__() 。

5,流程控制语句

半世苍凉 提交于 2020-03-25 19:04:09
3 月,跳不动了?>>> 流程控制语句 条件语句:if if语句用于实现条件判断,让程序作出简单或复杂的决策。 if...else... ​ if...elif...else 循环语句: 1)条件循环while语句 定义 while语句用于实现条件循环,可以在条件满足的情况下循环执行代码块 若结果为真则执行循环,反之不执行(若...则循环...) 语法· While条件判断: While条件判断根据代码返回的布尔逻辑结果True或False来进行选择操作 与if条件一样 布尔/比较/身份成员操作能够返回True和False 布尔操作 and or not 比较操作 == != > < > = < = 成员操作 in not in 身份操作 is is not 一般在条件判断之前,会有初始语句,例如定义变量初始值等 n = 0 i = 1 循环代码块 重复执行,直到条件不满足 一般包含递增赋值语句,确保循环最终能退出 i = i + 1 2)for循环语句 for语句用于实现循环,例如对列表和字符等可迭代对象进行遍历 语法 for X in Y X为变量 Y为可迭代对象 可以是字符串/元祖/列表/字典/函数等可迭代对象 for+range for语句结合range( ) 功能 range( )函数可以生成整数列表 range(x,y)会生成x到y-1的整数列表 range(1,10

C++ map的方法

不羁岁月 提交于 2020-03-25 06:44:10
参考文档: http://blog.csdn.net/allovexuwenqiang/article/details/5686583 Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,总结了一些map基本简单实用的操作! 1. map最基本的构造函数; map<string , int >mapstring; map<int ,string >mapint; map<sring, char>mapstring; map< char ,string>mapchar; map<char ,int>mapchar; map<int ,char >mapint; 2. map添加数据; map<int ,string> maplive; 1.maplive.insert(pair<int,string>(102,"aclive")); 2.maplive.insert(map<int,string>::value_type(321,"hai")); 3, maplive[112]="April";//map中最简单最常用的插入添加! 3,map中元素的查找: find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。 map<int ,string >::iterator l_it;; l_it