C中的递归问题

在C语言中,所有的执行语句都只能出现在函数之中。同样,函数的调用也只能出现在某函数的函数体内。函数的调用以两种方式出现:函数的嵌套与函数的递归。  C语言中,所有函数的定义都是互相平行和独立的,一个函数的定义不能包含另一个函数的定义,即不允许函数的嵌套定义。但函数的调用可以通过用一个函数另一个函数来实现,这就形成了函数的嵌套定义!C语言不限制嵌套的个数和层数,这样我们就可以自由,合理的组织程序的模块结构

程序调用自身的编程技巧称为递归( recursion)。 

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

 注意:  

(1) 递归就是在过程或函数里调用自身;  

(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口

(3)递归过程中必须要有逼近条件;

1fibonacci数列问题

#include<stdio.h>
static long fibonacci(int n)  //内部函数
{
    if(n==1||n==2)
        return 1;
    else
    {
        return fibonacci(n-2)+fibonacci(n-1);
    }
}
void main()
{
    int n,i;
    printf("Input n.");
    scanf("%d",&n);
    for(i=1;i<=n;++i)/*列出每一项的值*/
    {
        printf("%ld",fibonacci(i));
    }
}  

递归方式按位输出一个整数

#include<stdio.h>

void print(int n)
{
	if (n != 0)
	{
		print(n / 10);
		printf("%d", n % 10);
	}
}
int main()
{
	int a = 12345;
	print(a);
	printf("\n");
	return 0;

}

但值得注意的是 递归在调用过程中伴随着压栈等操作 过多次的递归不想看起来代码量减少变简单,而是更加复杂了   通常在return阶段执行的递归操作被称为 伪递归 ,

伪递归可以用迭代方式进行替换  大大减少了内存的压力

fibonacci数列问题的非递归实现

int _fib(int n)
{
	int n1 = 1;
	int n2 = 1;
	int n3 = 0;
	if(n <= 2)
		return 1;
	else
		while(n>2)
		{
			n3 = n1 + n2;
			n1 = n2;
			n2 = n3;
			n--;
		}
	return n3;
}
时间: 2024-10-10 11:03:01

C中的递归问题的相关文章

Why coding like This ------ 递归以及枚举中的递归

title: "Why coding like This -- 递归以及枚举中的递归" date: 2015-08-28 21:34:16 categories: "why coding like this" tags: [swift进阶] Topic 1: 输入一个数组xs:[Int],对全体元素求和. Discuss 思路一: Hey,伙计,遍历数组,逐个相加,so easy! code: func sum1(xs:[Int])->Int{ var sum

静态路由中的递归路由原理与冗余备份链路的实现

如图1-4的拓扑中, R1去往R4的10.1.1.0/24网段,可以配置静态路由并以R2的fa0/1接口的IP地址为下一跳,但当R2的fa0/1端口为down时,需手动把静态路由切换到R3的fa0/1接口的IP地址,反之亦然. 图1-4 当链路数量很大时,在静态路由中关联直连网段中的下一跳地址,配置工作将非常巨大.此时可以在静态路由中关联非直连网段中的下一跳地址.例如当R1要访问R4上的直连网段10.1.1.0/24时,可以将R1的静态路由直接关联R4的fa0/0接口的IP地址 (ip rout

数据结构二叉树——建立二叉树、中序递归遍历、非递归遍历、层次遍历

数据结构二叉树-- 编写函数实现:建立二叉树.中序递归遍历.借助栈实现中序非递归遍历.借助队列实现层次遍历.求高度.结点数.叶子数及交换左右子树. ("."表示空子树) #include<stdio.h> #include<stdlib.h> //***********二叉树链表节点结构 typedef char DataType; typedef struct Node {  DataType data;  struct Node*LChild;  struc

中根递归遍历二叉树,并输出权值大于50的节点

/** * @author 黄志伟 */ public class Search{ public static void main(String[] args){ Node A = new Node(); A.setValue(51); Node B = new Node(); B.setValue(52); Node C = new Node(); C.setValue(53); Node D = new Node(); D.setValue(49); Node E = new Node();

php中通过递归实现删除目录下的所有文件

(本文转载于:www.klsele.com.cn) php中通过递归实现删除目录下的所有文件.,有需要的朋友可以参考下. 最近遇到一个实际问题,需要清空制定目录下的所有文件及清空数据库.清空数据库不难,但要如何递归删除一个目录下的所有文件呢. 于是去网上研究了下资料再加上自己琢磨解决了这一问题. 先贴代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <?php function delFile($dirName){     if ($handl

MVC的Views中使用递归生成Html【转】

在开发过程中往往会有一个需求,就是将一个树状的数据结构在视图中表示出来.例如最传统的多级分类,系统中有一系列根分类,每个分类中又带有一些子分类,而我们的目标便是在页面上生成一个由ul和li嵌套组成的HTML结构.这个问题看似简单,但是如何让实现变的轻松.易于使用也是一个值得讨论的问题.这次就来谈谈这部分的情况. 实现目标 首先来明确一下实现目标.例如我们有一个Category对象,表示一个类别: public class Category { public string Name { get;

C#函数式编程中的递归调用之尾递归详解

关于递归相信大家已经熟悉的不能再熟悉了,所以笔者在这里就不多费口舌,不懂的读者们可以在博客园中找到很多与之相关的博客.下面我们直接切入正题,开始介绍尾递归. 尾递归 普通递归和尾递归如果仅仅只是从代码的角度出发来看,我们可能发现不了他的特点,所以笔者利用两张堆栈上的图来展示具体的差距在哪,首先我们来看看普通的递归调用的情况,如下图1.1所示: 假设这里执行的函数是Func1,并且Func1中通过递归调用了自己,那么我们可以看到栈上在每次调用Func1的时候都会重新将函数返回地址等其他参数放入栈中

2018.3.31 java中的递归

java中的递归 1.概念 定义一个方法时,出现本方法调用本方法的过程,称之为递归 2.特点 必然有一个边界条件 使用递归代码往往更简洁,可读性强 3.什么时候使用递归 n的阶乘和n的累加定义 f(n) =1 f(n)=f(n)*f(n-1) 4.普通实现与递归实现的比较 普通实现 //计算5的阶乘 public class Demo { public static void main(String[] args) { int sum = 1; for (int i =5; i >=1; i--

尾递归 递归函数中,递归调用是整个函数体中最后的语句,且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归,空间复杂度是O(1)

什么是递归深度 递归深度就是递归函数在内存中,同时存在的最大次数. 例如下面这段求阶乘的代码: Java: int factorial(int n) { if (n == 1) { return 1; } return factorial(n - 1) * n; } Python: def factorial(n): if n == 1: return 1 return factorial(n-1) * n C++: int factorial(int n) { if (n == 1) { re

C语言中的递归

思路 下图描述的是从问题引出到问题变异的思维过程: 概述 本文以数制转换为引,对递归进行分析.主要是从多角度分析递归过程及讨论递归特点和用法. 引子 一次在完成某个程序时,突然想要实现任意进制数相互转换,于是就琢磨,至少涉及以下参数: 源进制数:scr 目标进制:dest_d实现的大致思路: scr --> 数字分解 --> 按权求和 --> dest很明显这个过程是先正序分解,然后逆序求和,所以我就联想到了递归. 递归 1. 递归的含义 递归就是递归函数.递归函数是直接或间接调用自身的