【算法設計】遞歸和分治

任務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("未找到該元素!");

}

 

}

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