遞歸(六):遞歸小程序閱讀


閱讀下列程序,寫出程序執行后的輸出結果。

1. 

#include <iostream>
using namespace std;
int fun(int x)
{
    int f;
    if (x<=2) f=1;
    else f= fun(x-1)+fun(x-2);
    return f;
}
int main()
{
    cout<<fun(8)<<endl;
    return 0;
}

分析:int fun(int x)函數通過遞歸求斐波那契數列第x項的值。遞歸終止時:f(1)=f(2)=1,遞歸式子為:f(n)=f(n-1)+f(n-2)。

程序輸出結果為: 21

 

2.

#include <stdio.h>
int f(int n, int m)
{
      if (m>n) return 0;
      if (m==1) return n ;
      return  f(n-1,m-1) + f(n-1,m);
}
int main()
{
      printf("%d\n",f(5,3));
      return 0;
}

分析:int f(int n, int m)函數通過遞歸求從n個數中選出m個數的組合數。遞歸終止條件為:m>n(需要選出的數比待選數多,不可能選出,故返回0)或m=1(n個數中任選1個數有n種選擇,故返回n)。遞歸式為:

           f(n,m) = f(n-1,m-1) + f(n-1,m)   當n>=m>1時。

      從n個數中選擇出m個數可以看成兩種情況:(1)選擇第n個數,此時需要在前n-1個數中選擇m-1個數,即調用f(n-1,m-1);(2)不選擇第n個數,此時需要在前n-1個數中選擇m個數,即調用f(n-1,m)。

程序輸出結果為: 10

 

3.

#include <stdio.h>
int f(int a,int b)
{
    if  (a%b)  return f(b,a%b);
    else return b;
}
int main()
{
    printf("%d\n",f(20,12));
    return 0;
}

分析:int f(int a,int b)函數的功能是求整數a和b的最大公約數。

程序輸出結果為: 4

 

4.

#include <stdio.h>
int fun(int x)
{
    if (x<10) return x;
    else return x%10+fun(x/10);
}
int main()
{
    printf("%d\n",fun(19491001));
    return 0;
}

分析:int fun(int x) 函數的功能是求整數x的各位數字之和。遞歸終止條件為:x<10,即1位數的數字和是其本身;遞歸式含義為:若整數x的位數n>=2,則其各位數字和可以看成是其個位數字(x%10)加上其高n-1位數字組成的整數x/10的各位數字之和fun(x/10)。

程序輸出結果為:25

 

5.

#include <stdio.h>
int f(int k)
{
    if (k<0)
       return k*2;
    else
       return f(k-2)+k;
}
int main()
{
    printf("%d\n",f(5));
    return 0;
}

分析:為求f(5),要求f(3)+5;而f(3)=f(1)+3,f(1)=f(-1)+1,f(-1)=2*(-1)=-2,所以f(1)=-1,f(3)=2,f(5)=7。

程序輸出結果為:7

 

6.

#include <stdio.h>
int f(int n, int m)
{

    int i, sum;
    if (m == 1) return 1;
    sum = 0;
    for (i = 1; i <=n; i++)
        sum += f(i, m - 1);
    return sum;
}
int main()
{
    printf("%d\n",f(5,3));
    return 0;
}

分析:為求f(5,3),需求f(1,2)+f(2,2)+f(3,2)+f(4,2)+f(5,2),

        f(1,2)=f(1,1)=1,

        f(2,2)=f(1,1)+f(2,1)=1+1=2,

        f(3,2)=f(1,1)+f(2,1)+f(3,1)=1+1+1=3, 

        f(4,2)=f(1,1)+f(2,1)+f(3,1)+f(4,1)=1+1+1+1=4

        f(5,2)=f(1,1)+f(2,1)+f(3,1)+f(4,1)+f(5,1)=1+1+1+1+1=5。

程序輸出結果為: 15

擴展:若 將程序中的 “if (m == 1) return 1;”改寫為“if (m == 1) return n;”,則

f(5,3)=1+(1+2)+(1+2+3)+(1+2+3+4)+(1+2+3+4+5)=35.

 

7.

#include <stdio.h>
void prim(int m, int n)
{
    if(m>n)
    {
         while(m%n != 0) n++;
         m /= n;
         prim(m, n);
         printf("%d*",n);
    }
}
int main()
{
    prim(60,2);
    return 0;
}

分析:void prim(int m, int n)函數的功能是將整數m從質因數n開始分解質因數。

程序輸出結果為:5*3*2*2*

 

8.

#include <stdio.h>
void fun(char s[], int n)
{
    if (n<2)
        return;
    char t;
    t=s[0]; s[0]=s[n-1]; s[n-1]=t;
    fun(&s[1],n-2);
}
int main()
{
    char s[]="ABCDEFG";
    fun(s,7);
    printf("%s\n",s);
    return 0;
}

分析:void fun(char s[], int n)函數的功能是將具有n個元素的數組s逆序。遞歸終止條件為:n<2,當數組中元素個數不足2個時,直接返回;當元素個數超過2個時,將首尾元素交換,然后將中間n-2個元素逆序,即遞歸調用 fun(&s[1],n-2)。

程序輸出結果為:GFEDCBA

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM