手机版

递归函数和非递归函数的转变

时间:2025-04-19   来源:未知    
字号:

递归函数和非递归函数的转变

第6章 递归6.1 什么是递归6.2 递归算法的设计 6.3 递归算法到非递归算法的转换

本章小结

递归函数和非递归函数的转变

6.1 什么是递归6.1.1 递归的定义在定义一个过程或函数时出现调用本过程或本

函数的成分,称之为递归。若调用自身,称之为直接递归。若过程或函数p调用过程或函数q,而q又调用 p,称之为间接递归。

递归函数和非递归函数的转变

例 求n!(n为正整数) 。一般的方法:

n! = 1*2*…*(n-1)*n递归的方法:

1, 当n 0时 n! n ( n 1)!, 当 n 1 时

递归函数和非递归函数的转变

int factorial(int n) { int x; if (n==0) x=1; else x=factorial (n-1)*n; return(x); }

在该函数factorial (n)求解过程中,直接调用factorial (n-1)自身,所以它是一个直接递归函数。

递归函数和非递归函数的转变

递归函数和非递归函数的转变

n=4

int factorial(int n) { int x; if (n==0) x=1; else x=factorial (n-1)*n; return(x); }

n=3

n=2

n=1

n=0

递归函数和非递归函数的转变

6.1.2 何时使用递归 在以下三种情况下,常常要用到递归的方法。 1. 定义是递归的

2. 数据结构是递归的3. 问题的求解方法是递归的

递归函数和非递归函数的转变

1. 定义是递归的

有许多数学公式、数列等的定义是递归的。这些问题的求解过程可以将其递归定义直接转化为对应

的递归算法。例如,求Fibonacci数列:n, n 0,1 Fib(n) Fib(n 1) Fib(n 2), n 1

递归函数和非递归函数的转变

2. 数据结构是递归的 有些数据结构是递归的。例如,第2章中介绍过的单 链表就是一种递归数据结构,其结点类型定义如下:typedef struct LNode { ElemType data; struct LNode *next;

} LinkList;

递归函数和非递归函数的转变

对于递归数据结构,采用递归的方法编写算法既方 便又有效。例如,求一个不带头结点的单链表head的所 有data域(假设为int型)之和的递归算法:int Sum(LinkList *head) { if (head==NULL) return 0;

elsereturn (head->data+Sum(head->next)); }

递归函数和非递归函数的转变

3. 问题的求解方法是递归的 有些问题的解法是递归的,典型的有汉诺塔(Tower of Hanoi)问题求解:

盘片移动时必须遵守以下规则: 每次只能移动一个盘片; 盘片可以插在A,B和C中任一塔座; 不能将一个较大的盘片放在较小的盘片上。

递归函数和非递归函数的转变

Hanoi(n,a,b,c)

Hanoi(n-1,a,c,b);

move(n,a,c); Hanoi(n-1,b,a,c)

递归函数和非递归函数的转变

6.1.3 递归模型递归模型是递归算法的抽象,它反映递归问题的 递归结构,例如,前面的递归算法对应的递归模型如下: fun(0)=1 fun(n)=n*fun(n-1) n=0 (1) n>0 (2)

其中:第一个式子给出了递归的终止条件,我们称 之 为 递 归 出 口 ; 第 二 个 式 子 给 出 了 fun(n) 的 值 与 fun(n-1)的值之间的关系,我们称之为递归体。

递归函数和非递归函数的转变

一般地,一个递归模型是由递归出口和递归体两部 分组成, 前者确定递归到何时结束, 后者确定递归求解 时的递推关系。 递归出口的一般格式如下: f(s1)=m1 (6.1)

这里的s1 与m1 均为常量,有些递归问题可能有几个 递归出口。

递归函数和非递归函数的转变

递归体的一般格式如下:

f(sn+1)=g(f(si),f(si+1),…,f(sn),cj,cj+1,…,cm)

其中,

(6.2)

n,i,j,m均为正整数。sn+1是一个递归“大问题”, si,si+1,…,sn为递归“小问题”, cj,cj+1,…,cm是可以用非递归方法直接解决的问题 g是一个非递归函数,可以直接求值。

递归函数和非递归函数的转变

递归思路实际上, 递归思路是把一个不能或不好直接求解

的“大问题”转化成一个或几个“小问题”来解决,再把这些“小问题”进一步分解成更小的“小问题” 来解决,如此分解,直至每个“小问题”都可以直接解 决(此时分解到递归出口)。 但递归分解不是随意的分解,递归分解要保证“大

问题”与“小问题”相似,即求解过程与环境都相似。并且有一个分解的终点。从而使问题可解。

…… 此处隐藏:20字,全部文档内容请下载后查看。喜欢就下载吧 ……
递归函数和非递归函数的转变.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
    ×
    二维码
    × 游客快捷下载通道(下载后可以自由复制和排版)
    VIP包月下载
    特价:29 元/月 原价:99元
    低至 0.3 元/份 每月下载150
    全站内容免费自由复制
    VIP包月下载
    特价:29 元/月 原价:99元
    低至 0.3 元/份 每月下载150
    全站内容免费自由复制
    注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
    × 常见问题(客服时间:周一到周五 9:30-18:00)