3.2.4递归函数程序设计 - 递归函数程序设计_第1页
3.2.4递归函数程序设计 - 递归函数程序设计_第2页
3.2.4递归函数程序设计 - 递归函数程序设计_第3页
3.2.4递归函数程序设计 - 递归函数程序设计_第4页
3.2.4递归函数程序设计 - 递归函数程序设计_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章函数程序设计第2节递归函数程序设计

1程序解析2递归函数基本概念3递归程序设计1汉诺(Hanoi)塔问题解析

将64个盘从座A搬到座B(1)一次只能搬一个盘子(2)盘子只能插在A、B、C三个杆中(3)大盘不能压在小盘上

A B C分析

A B C分析

A B C

A B Cnn-1n-1分析

A B C

A B Cn1汉诺(Hanoi)塔问题解析递归方法的两个要点(1)递归出口:一个盘子的解决方法;(2)递归式子:如何把搬动64个盘子的问题简化成搬动63个盘子的问题。把汉诺塔的递归解法归纳成三个步骤:n-1个盘子从座A搬到座C第n号盘子从座A搬到座Bn-1个盘子从座C搬到座B算法:hanio(n个盘,A→B,C为过渡){if(n==1)

直接把盘子A→Belse{hanio(n-1个盘,A→C,B为过渡)

把第n号盘A→B hanio(n-1个盘,C→B,A为过渡) }}

A B Cn-12递归函数基本概念例

用递归函数实现求n!递推法在学习循环时,计算n!采用的就是递推法:

n!=1×2×3×…×n用循环语句实现:

result=1; for(i=1;i<=n;i++) result=result*i;递归法n!=n×(n-1)! 当n>1 递归式子=1 当n=1或n=0 递归出口即求n!可以在(n-1)!的基础上再乘上n。如果把求n!写成函数fact(n),则fact(n)的实现依赖于fact(n-1)。例10-2用递归函数求n!。#include<stdio.h>doublefact(intn);intmain(void){intn;scanf("%d",&n);printf("%f",fact(n));return0;}doublefact(intn) /*函数定义*/{doubleresult;

if(n==1||n==0) /*递归出口*/result=1;elseresult=n*fact(n-1);

returnresult;}2递归函数基本概念递归式递归出口分析求n!递归定义n!=n*(n-1)!(n>1)n!=1(n=0,1)#include<stdio.h>doublefact(intn);intmain(void){intn;scanf("%d",&n);printf("%f",fact(n));return0;}doublefact(intn){doubleresult;

if(n==1||n==0)result=1;elseresult=n*fact(n-1);

returnresult;}fact(n)=n*fact(n-1);main()fact(3)fact(2)fact(1){....{....{....{....printf(fact(3))f=3*fact(2)f=2*fact(1)f=1}return(f)return(f)return(f)}}}递归函数fact(n)的实现过程fact(3)=3*fact(2)=

2*fact(1)=

fact(1)=12*1=23*2=6同时有4个函数在运行,且都未完成3递归程序设计用递归实现的问题,满足两个条件:问题可以逐步简化成自身较简单的形式(递归式)n!=n*(n-1)!nn-1Σi=n+Σi

i=1i=1递归最终能结束(递归出口)两个条件缺一不可解决递归问题的两个着眼点3递归程序设计例

编写递归函数reverse(intn)实现将整数n逆序输出。

分析:将整数n逆序输出可以用循环实现,且循环次数与n的位数有关。递归实现整数逆序输出也需要用位数作为控制点。归纳递归实现的两个关键点如下:递归出口:直接输出n,如果n<=9,即n为1位数递归式子:输出个位数n%10,再递归调用reverse(n/10)输出前n-1位,如果n为多位数3递归程序设计由于结果是在屏幕上输出,因此函数返回类型为voidvoidreverse(intnum){ if(num<=9) printf("%d",num); /*递归出口*/ else{ printf("%d",num%10); reverse(num/10); /*递归调用*/ }}例

汉诺(Hanoi)塔问题

A B Chanio(n个盘,A→B,C为过渡){if(n==1)

直接把盘子A→Belse{hanio(n-1个盘,A→C,B为过渡)

把n号盘A→B hanio(n-1个盘,C→B,A为过渡) }}

源程序

/*搬动n个盘,从a到b,c为中间过渡*/voidhanio(intn,chara,charb,charc){if(n==1)printf("%c-->%c\n",a,b);else{hanio(n-1,a,c,b);printf("%c-->%c\n",a,b);hanio(n-1,c,b,a);}}intmain(void){intn;printf("inputthenumberofdisk:");scanf("%d",&n);printf("thestepsfor%ddiskare:\n",n);hanio(n,'a',‘b',‘c');return0;}inputthenumberofdisk:3t

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论