【算法设计】递归和分治

任务1:计算斐波那契数列,首元素从序号0 开始

任务描述:分别利用递归和迭代法输出斐波那契数列的第n项的值,检查输出结果的正确性。将代码复制粘贴到方框中,将运行结果截图。

算法输入:7

算法输出:斐波那契数列中第n项=21

//递归法

#include<stdio.h>

int fun(int n){

 if(n==0||n==1)

 return 1;

 else

 return fun(n-1)+fun(n-2);

}

int main(void){

 int n,i=0;

 printf("请输入要输出第几项:");

 scanf("%d",&n);

 if(n>=1)

 for(i=0;i<n;i++){

  printf("斐波那契数列的第%d项是:%d",i+1,fun(i+1));

 } else

 printf("输入错误,请重新输入!");

 return 0;

}

 

//迭代法

#include<stdio.h>

main(){

 int a,b,c;

 int i,n;

 printf("请输入一个正整数:");

 scanf("%d",&n);

 a=b=1;

 if(n<=2)

 c=1;

 else

 for(i=2;i<=n;i++){

  c=a+b;

  a=b;

  b=c;

 }

 printf("第%d项的为:%d\n",n,c);

 

}

任务2:汉诺塔问题

任务描述:修改代码输出汉诺塔问题的全部移动步骤,初始状态所有圆盘在B塔,要求移动到A塔。将代码复制粘贴到方框中,将运行结果截图。

void hanoi(int n,char a,char b,char c)

{//把n个盘子从a柱移动到c柱

   if(n>0)

   {

       hanoi(n-1,a,c,b);//n-1个盘子从a移动到b

       printf("%c->%c\n",a,c);//1个盘子从a移动到c

       hanoi(n-1,b,a,c);//n-1个盘子从b移动到c

   }

}

 

#include <stdio.h>

#include <stdlib.h>

 

void main()

{

    int n;

    scanf ("%d",&n);

    hanoi (n,'b','c','a');

 

}

 

void hanoi(int n,char b,char c,char a)

{//把n个盘子从b柱移动到a柱

    if(n>0)

    {

        hanoi(n-1,b,a,c);//n-1个盘子从b->c

        printf("%c->%c\n",b,a);//1个盘子从b->a

        hanoi(n-1,c,b,a);//n-1个盘子从c-a

    }

    else if(n==1)

        printf("%c->%c\n",b,a);//直接从b->c

}

 

任务3:有序序列的二分搜索(递归)算法的设计与实现

任务描述:阅读下面的代码,完成括号中的关键代码,完善程序,利用递归技术实现二分搜索,检查结果的正确性,将代码粘贴到方框中。

int BinSearch(int a[ ],int low, int high, int key)

{

   if (low<=high)

      { 

      int mid = (low+high)/2;//一分为二

             if(         )

                    return mid;//找到key,返回所在位置(递归结束)

             else if(key<a[mid])

                    (           )//递归求解

             else if(key>a[mid])

                    (           )//递归求解

      }

      else

             return -1;//未找到返回-1

}

#include<stdio.h>

#include<stdlib.h>

void main(){

int a[5],i,key;

int low = 0;

int high = sizeof(a)/sizeof(a[0]) -1 ;

 

printf("input array:");

for(i=0;i<=4;i++){

    scanf("%d",&a[i]);

}

 

printf("input key number:");

scanf("%d",&key);

 

//进行二分查找

while(low<=high){

    int mid = (low+high)/2;

    if(key>a[mid])

    {

        low = mid +1;

    }

    else if(key<a[mid])

    {

        high = mid -1;

    }

    else

    {

        printf("目标元素数组下标是%d",mid);

        break;

    }

}

if(low>high)

{

    printf("未找到该元素!");

}

 

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章