递推与递归

有些问题,可以用递推,也可以用递归的方法解决。

递推:从一个已知的事实出发,按一定规律推出下一个事实,再从已知的新的事实,推出下一个新的事实.

  用递推法求n!   ,即从1开始, 2, 3....一直到

#include<stdio.h>

void main(   )

{ int  i, s=1;

  for(i=1;i<=5;i++)

      s=s* i;

  printf(“s=%d\ n”,s); 

}

递归:在函数调用自身时,要给出结束递归的条件

先回推再递推

如:n!,

            5!=5 × 4!

            4!=4 × 3!

            3!=3 × 2!

            2!=2 × 1!  

            1!=1

            0!=1 

     

       { 1                (n=0,1)

n!= {

       { n*(n-1)!      (n>1)

   

#include<stdio.h>

voidmain()

{float fac(int n);

   int n;  float y;

   printf("Input a integernumber:");

   scanf("%d",&n);

   y=fac(n);

   printf("%d! =%15d",n,y);

}

floatfac(int n)

{float f;

   if(n<0) printf("n<0,data error!");

   else if(n==0||n==1)  f=1;

          else f=fac(n-1)*n;

   return(f);}


算法分析——Hanoi塔问题

十九世纪未,欧洲珍奇商店出现一种汉诺塔游戏,推销材料介绍说:古代印度布拉玛庙里的僧侣们正在玩这种游戏,如果游戏结束,世界未日即来临。是一个只能用递归方法解决的问题。 
规则及分析: 
n个盘子从一根针移到另一根针,每次只能移动一个盘子,不允许大盘在小盘上面。 
共有三根针,n个盘子由A移到C,需移动的次数是2n -1, 若64个盘子移动的次数为: 
264 - 1=18, 446, 744, 073, 709, 551, 600 
一年的秒数是:365 x 24 x 60 x 60=31536000 
18446744073709511600÷31536000 
=58494217355年 
即:5849亿年, 从能源角度推算, 太阳系寿命只有150亿年

方法与步骤

An-1个盘子借助C移到B

A上剩下一个盘子送到C

n-1个盘子从B借助A移到C

简化实例:将A上3个盘子移到C
步骤:1. A上两个盘子借助C移到B 
            2. A上最后一个盘子移到C (可直接完成)
            3. B上两个盘子借助A移到C 
第一步进一步分解: 
1.1  A上一个盘子从AC 
1.2  A上一个盘子从AB 
1.3  C上一个盘子从CB 
第三步进一步分解: 
3.1 B上一个盘子从BA 
3.2 B上一个盘子从BC
3.3 A上一个盘子从AC

共移动7步:23-1次
所以,n个盘要移动2n-1次

结论:上面三个步骤包含两类操作
步骤1和3都是将n-1个盘子从一个针移到另一个针上(n>1时),这是一个递归的过程;方法一样,只是针的名称不同而已,为使问题一般化,将步骤1和3表示为:将one 针上的n-1个盘子移到two针,借助 three针,只是对应关系不同。
第一步对应关系:one  A       two  B     three  C 
第三步对应关系:one  B       two   C     three  A 
将1个盘子从一个针上移到另一针上。
因此,可以用两个函数分别实现上面两类操作,用hanoi函数实现第一类操作,用move函数实现第2类操作。
hanoi(n,one,two,three)   将n个盘从 one → three借助two

move(x,y)   将1个盘从x → y座,x、y根据情况取代ABC座中的1个。

#include <stdio.h>
void main()
{ void hanoi(int n,char one,char two,char three);
   int m;
   printf("Input the number of diskes:");
   scanf("%d",&m);
   printf("The step to moving %3d diskes:\n",m);
   hanoi(m,'A','B','C');}
void hanoi(int n,char one,char two,char three)
{void move(char  x, char  y);
  if(n==1)  move(one,three);
    else { hanoi(n-1,one,three,two);
              move(one,three);
              hanoi(n-1,two,one,three);
}} 
void move(char  x, char  y)
{ printf("%c--->%c\n",x, y); }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值