递归

【SICP练习】5 练习1.9

ぃ、小莉子 提交于 2021-02-06 07:59:42
 以下是第一个加起两个正整数的方法,其中 inc 将参数加 1 , dec 将参数减 1 。 (define (+ a b) (if(= a 0) b (inc (+ (dec a) b)))) 用代换模型展示 (+ 4 5) 如下: (+ 4 5) (inc (+ 3 5)) (inc (inc (+ 2 5))) (inc (inc (inc (+ 1 5)))) (inc (inc (inc (inc (+ 0 5))))) (inc (inc (inc (inc 5)))) (inc (inc (inc 6))) (inc (inc 7)) (inc 8) 9 如上所示,在代换模型展示中包含了伸展和收缩两个阶段,并且伸展阶段所需的额外存储量和计算所需的步数都正比于参数 a 。因此这是一个线性递归过程。 以下是另一个加起两个正整数的方法。 (define (+ a b) (if(= a 0) b (+ (dec a) (inc b)))) 同样用代换模型展示 (+ 4 5) 如下: (+ 4 5) (+ 3 6) (+ 2 7) (+ 1 8) (+ 0 9) 9 在这个过程中并没有任何增长或者收缩,而其计算过程可用固定数目的状态变量( a )描述。这是一个线性迭代过程。 版权声明:本文为 NoMasp柯于旺 原创文章,未经许可严禁转载!欢迎访问我的博客:http:/

java递归

时间秒杀一切 提交于 2020-11-06 07:56:51
import java.util.Scanner; class DG { public int count(int n){ if(n==1) return 1; else return count(n-1)+n; } } public class Test { public static void main(String[] args){ Scanner sc = new Scanner(System.in); DG dg = new DG(); System.out.print("请输入一个数:"); int n =sc.nextInt(); System.out.println(dg.count(n)); } } 来源: oschina 链接: https://my.oschina.net/u/988276/blog/117581

谜题40:不情愿的构造器

≯℡__Kan透↙ 提交于 2020-04-08 13:57:47
尽管在一个方法声明中看到一个throws子句是很常见的,但是在构造器的声明中看到一个throws子句就很少见了。下面的程序就有这样的一个声明。那么,它将打印出什么呢? public class Reluctant { private Reluctant internalInstance = new Reluctant(); public Reluctant() throws Exception { throw new Exception("I‘m not coming out"); } public static void main(String[] args) { try { Reluctant b = new Reluctant(); System.out.println("Surprise!"); } catch (Exception ex) { System.out.println("I told you so"); } } } main方法调用了Reluctant构造器,它将抛出一个异常。你可能期望catch子句能够捕获这个异常,并且打印I told you so。凑近仔细看看这个程序就会发现,Reluctant实例还包含第二个内部实例,它的构造器也会抛出一个异常。无论抛出哪一个异常,看起来main中的catch子句都应该捕获它,因此预测该程序将打印I told

python基础知识之函数与函数式编程

允我心安 提交于 2020-04-08 12:25:21
3种编程方式:   1.面向对象(最火的)。(过去大部分的编程方式);》》主要是依靠:类》》class ,就是具有逻辑的过程,说话的方式描述   2.面向过程。主要是 过程》》def 过程是没有返回值的函数,但是python也会返回none 基本与函数式编程没有区别了,最小的单元是一个一个的def定义的过程,一个一个逻辑是def定义的过程   3.函数式编程。编的函数更接近数学中的函数 是一种编程规范 也就是如何编程的方法论 主要是 函数》》def 例如lisp #hashshell erlang# 三种语言 可以 真正较纯粹的使用函数式编程来编写程序。 示例:(1+2)*3-4 传统编程方法:var a =1+2;        var b =1*3;        var c =b-4; 函数式编程则要求使用函数进行,把不同的运算定义成不同函数进行计算,写成下面的形式来进行: var result = subtract(multiplely(add(1,2),3),4); python中的函数式编程是:逻辑结构化和过程化的一种编程方法 一,函数基础介绍(day3 22)【funt_test.PY】 def func1():#函数 '''文档介绍''' print('in the func1')#过程 return 0#返回值 def func2():#过程 '''文档介绍'''

机器学习——详解KD-Tree原理

混江龙づ霸主 提交于 2020-04-08 10:53:25
本文始发于个人公众号: TechFlow ,原创不易,求个关注 今天是机器学习的 第15篇文章 ,之前的文章当中讲了Kmeans的相关优化,还讲了大名鼎鼎的EM算法。有些小伙伴表示喜欢看这些硬核的,于是今天上点硬菜,我们来看一个机器学习领域经常用到的数据结构—— KD-Tree 。 从线段树到KD树 在讲KD树之前,我们先来了解一下 线段树 的概念。线段树在机器学习领域当中不太常见,作为高性能维护的数据结构,经常出现在各种算法比赛当中。线段树的本质是一棵维护一段区间的平衡二叉树。 比如下图就是一个经典的线段树: 从下图当中我们不难看出来,这棵线段树维护的是一个 区间内的最大值 。比如树根是8,维护的是整个区间的最大值,每一个中间节点的值都是以它为树根的子树中所有元素的最大值。 通过线段树,我们可以在 的时间内计算出某一个 连续区间的最大值 。比如我们来看下图: 当我们要求被框起来的区间中的最大值,我们只需要 找到能够覆盖这个区间的中间节点 就行。我们可以发现被红框框起来的两个节点的子树刚好覆盖这个区间,于是整个区间的最大值,就是这两个元素的最大值。这样,我们就把一个需要 查找的问题降低成了 ,不但如此,我们也可以 做到 复杂度内的更新 ,也就是说我们不但可以快速查询,还可以更新线段当中的元素。 当然线段树的应用非常广泛,也有 许多种变体 ,这里我们不过多深入

递归渲染树

你离开我真会死。 提交于 2020-04-08 06:39:59
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <style> #aside .aside-content>ul ul{ display: none; } </style> </head> <body> <div id="aside" style="padding: 20px;border: 1px solid;"> <div class="aside-scroll" style="padding: 20px;border: 1px solid;"> <div class="aside-content" style="padding: 20px;border: 1px solid;"> </div> </div> </div> <script type="text/javascript" src="js/jquery-2.1.1.min.js" ></script> <script> //也可以单独提取到json文件中,通过get方式ajax读取 var nodes =[ { id:1, pId:0, name:"随意勾选 1"}, { id:11, pId:1, name:"随意勾选 1-1"}, { id:111, pId:11, name:"随意勾选 1-1-1"}, { id:112, pId:11, name:

Problem C: 【递归入门】组合+判断素数

最后都变了- 提交于 2020-04-07 21:36:04
Description 已知 n 个整数b1,b2,…,bn 以及一个整数 k(k<n)。 从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。 例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为:     3+7+12=22  3+7+19=29  7+12+19=38  3+12+19=34。   现在,要求你计算出和为素数共有多少种。 例如上例,只有一种的和为素数:3+7+19=29。 Input 第一行两个整数:n , k (1<=n<=20,k<n) 第二行n个整数:x1,x2,…,xn (1<=xi<=5000000) Output 一个整数(满足条件的方案数)。 Sample Input 4 3 3 7 12 19 Sample Output 1 最终AC代码: #include <cstdio> int k, n, num, p[25], a[25]; //p[]数组保留选择的数组序号 bool vis[22]={false}; bool isPrime(int n){ if(n < 2) return false; for(int i=2; i*i<=n; i++) if(n%i == 0) return false; return true; } void DFS(int index){ if(index ==

js递归获取子节点所有父节点

淺唱寂寞╮ 提交于 2020-04-07 17:55:03
起因:业务中用到了element级联选择器,级联的反显需要这样的数据[id(父),id(父),id(当前选中)],由于后端的无能,不会遍历找所有关联的父节点,只能由前端来做,所以就写了一个简单的递归。 findAncestry (arr, id) { var temp = [] var forFn = function (list, id) { for (var i = 0; i < list.length; i++) { var item = list[i] if (item.id === id) { temp.push(item) forFn(list, item.pid) break } else { if (item.children) { forFn(item.children, id) } } } } forFn(arr, id) return temp } 来源: https://www.cnblogs.com/AaronLs/p/12654706.html

HDU2569 彼岸 递归

本秂侑毒 提交于 2020-04-07 16:54:09
彼岸 Problem Description 突破蝙蝠的包围,yifenfei来到一处悬崖面前,悬崖彼岸就是前进的方向,好在现在的yifenfei已经学过御剑术,可御剑轻松飞过悬崖。 现在的问题是:悬崖中间飞着很多红,黄,蓝三种颜色的珠子,假设我们把悬崖看成一条长度为n的线段,线段上的每一单位长度空间都可能飞过红,黄,蓝三种珠子,而yifenfei必定会在该空间上碰到一种颜色的珠子。如果在连续3段单位空间碰到的珠子颜色都不一样,则yifenfei就会坠落。 比如经过长度为3的悬崖,碰到的珠子先后为 “红黄蓝”,或者 “蓝红黄” 等类似情况就会坠落,而如果是 “红黄红” 或者 “红黄黄”等情况则可以安全到达。 现在请问:yifenfei安然抵达彼岸的方法有多少种? Input 输入数据首先给出一个整数C,表示测试组数。 然后是C组数据,每组包含一个正整数n (n<40)。 Output 对应每组输入数据,请输出一个整数,表示yifenfei安然抵达彼岸的方法数。 每组输出占一行。 Sample Input 2 2 3 Sample Output 9 21 Source ACM程序设计期末考试081230 注:这是给蒟蒻的自己写的,不要被误导哦 这道题以前不会,没有认真想,我估计现在自己也是迷迷糊糊的。先说下目前自己的理解: 分两种情况,X,Y,两者相加才是答案; X:第N-1项与第N

chapter20_File类、递归

为君一笑 提交于 2020-04-07 15:41:49
chapter20_File类、递归 File类 1.1 概述 java.io.File 类是文件和目录路径名的抽象表示 java把电脑中的文件和文件夹(目录)封装为一个File类,我们可以使用File类对文件/文件夹进行操作 主要用于文件和目录的创建、查找和删除等操作。 File类是一个与系统无关的类,任何的操作系统都可以使用类中的方法 重点:记几个单词 file:文件 path:路径 separator:分隔器 directtory:文件夹/目录 1.2 构造方法 public File(String pathname) :通过将给定的 路径名字符串 转换为抽象路径名来创建新的 File实例。 public File(String parent, String child) :从 父路径名字符串和子路径名字符串 创建新的 File实例。 public File(File parent, String child) :从 父抽象路径名和子路径名字符串 创建新的 File实例。 操作路径不能写死了 Windows 和Linux系统的分隔符不同 windows: C:\develop\a\a.txt Linux: C:/develop/a/a.txt 所以正确写法 "C:"+File.separator+"develop"+File.separator+"a"+File