Chapter 7. 递归

一、概念 conception

函数体内调用本函数自身,直到符合某一条件不再继续调用。

二、应满足条件 factor

1、有反复执行的过程(调用自身);

2、有跳出反复执行过程的条件(函数出口);

三、例子 example

/// <summary>
/// 计算阶乘:n!=n*(n-1)*(n-2)*(n-3)*......*1(n>0)
/// </summary>
/// <param name="i"></param>
/// <returns></returns>
     public int recursion(int i)
        {
            int sum = 0;
            if(i==1)
            {
                return i;
            }
            sum = i * recursion(i-1);
            return sum;
        }
        static void Main(string[] args)
        {
            Program digui = new Program();
            Console.WriteLine("5的阶乘:"+digui.recursion(5));
            Console.ReadLine();
        }

四、注意事项 notice

1、递归中必须要存在一个循环结束的条件

2、递归函数的每次调用都需要栈来存储,如果次数太多的话容易造成栈溢出。

五、练习

     /// <summary>
        /// 一群羊赶到各村去卖,每过一个村丢失之前总数的一半零一只,
        /// 过了7个村之后还剩2只,问最初赶出多少只羊
        /// </summary>
        /// <param name="village"></param>
        /// <returns></returns>
        public int Sheep (int village)
        {
            int sum = 0;
            if(village==7)
            {
                return 2;
            }
            sum = 2 * (Sheep(village+1)+1);
            return sum;
        }
        static void Main(string[] args)
        {
            Program hanshu = new Program();
            double x = hanshu.Sheep(0);
            Console.WriteLine("递归求羊:"+x);
            Console.ReadLine();
        }

时间: 2024-08-09 21:30:06

Chapter 7. 递归的相关文章

Chapter 4 递归式详解

ANSI Common Lisp Chapter 2

Chapter 2 总结 (Summary) Lisp 是一种交互式语言.如果你在顶层输入一个表达式, Lisp 会显示它的值. Lisp 程序由表达式组成.表达式可以是原子,或一个由操作符跟着零个或多个实参的列表.前序表示法代表操作符可以有任意数量的实参. Common Lisp 函数调用的求值规则: 依序对实参从左至右求值,接着把它们的值传入由操作符表示的函数. quote 操作符有自己的求值规则,它完封不动地返回实参. 除了一般的数据类型, Lisp 还有符号跟列表.由于 Lisp 程序是

zoj 3640 Help Me Escape (概率dp 递归求期望)

题目链接 Help Me Escape Time Limit: 2 Seconds      Memory Limit: 32768 KB Background     If thou doest well, shalt thou not be accepted? and if thou doest not well, sin lieth at the door. And unto thee shall be his desire, and thou shalt rule over him.  

EFFECTIVE OBJECTIVE-C 2.0 TIPS 总结 CHAPTER 1 &amp; CHAPTER 2

下面只是对读到的所有 Tips 结合我平时开发中遇到的问题进行总结,每一个 Tips 和书中的每一条对应,本文的目的是去掉书中的大部分讨论的内容,让人能够马上使用这些 Tips,建议阅读过原书后食用更佳. CHAPTER 1 熟悉 OBJECTIVE-C Tips 1 Objective-C 的起源 Objective-C 是从 C 语言演化而来,有 C 的一些基础会有很大帮助 Tips 2 头文件中减少引用 减少在类的头文件中 import 其他头文件,如果使用其他类,那么使用@class C

《算法导论》 — Chapter 7 高速排序

序 高速排序(QuickSort)也是一种排序算法,对包括n个数组的输入数组.最坏情况执行时间为O(n^2). 尽管这个最坏情况执行时间比較差.可是高速排序一般是用于排序的最佳有用选择.这是由于其平均性能相当好.期望的执行时间为O(nlgn).且O(nlgn)中隐含的常数因子非常小.另外它还能够进行就地排序在虚拟环境中也能非常好的工作. GitHub chapter 7 程序代码下载 原理 高速排序也和合并排序一样,基于分治法,分为分解.解决.合并三个步骤. 分解:数组array[low-hig

穷举递归和回溯算法终结篇

穷举递归和回溯算法 在一般的递归函数中,如二分查找.反转文件等,在每个决策点只需要调用一个递归(比如在二分查找,在每个节点我们只需要选择递归左子树或者右子树),在这样的递归调用中,递归调用形成了一个线性结构,而算法的性能取决于调用函数的栈深度.比如对于反转文件,调用栈的深度等于文件的大小:再比如二分查找,递归深度为O(nlogn),这两类递归调用都非常高效. 现在考虑子集问题或者全排列问题,在每一个决策点我们不在只是选择一个分支进行递归调用,而是要尝试所有的分支进行递归调用.在每一个决策点有多种

PHP_递归实现无限级分类

<?php /** * 递归方法实现无限级别分类 * @param array $list 要生成树形列表的数组[该数组中必须要有主键id 和 父级pid] * @param int $pid=0 父级id * @param int $level=0 缩进次数[用于指定分类名称要缩进的数量] */ function getTree($list,$pid=0,$level=0 ) { // static 表示声明一个静态变量, 静态变量在函数中会一直保存它的值 static $tree = arr

3.sql中的向上递归和向下递归

1.向下递归 select * from table_name where 条件 connect by prior bmbm(本级关联条件)=sjbmbm(上级关联条件) start with bmbm(本级关联条件)='610000000000'(本级编码)--包含本级 select * from table_name where 条件 connect by prior bmbm(本级关联条件)=sjbmbm(上级关联条件) start with sjbmbm(本级关联条件)='6100000

斐波那契数列的递归和非递归解法

//递归解法 function fib(n){ if(n < 1){ throw new Error('invalid arguments'); } if(n == 1 || n == 2){ return 1; } return fib(n - 1) + fib(n - 2); } //非递归解法 function fib(n){ if(n < 1){ throw new Error('invalid arguments'); } if(n == 1 || n == 2){ return 1