zoukankan      html  css  js  c++  java
  • 递归(六):递归小程序阅读

    阅读下列程序,写出程序执行后的输出结果。

    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 ",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 ",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 ",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 ",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 ",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 ",s);
        return 0;
    }

    分析:void fun(char s[], int n)函数的功能是将具有n个元素的数组s逆序。递归终止条件为:n<2,当数组中元素个数不足2个时,直接返回;当元素个数超过2个时,将首尾元素交换,然后将中间n-2个元素逆序,即递归调用 fun(&s[1],n-2)。

    程序输出结果为:GFEDCBA

  • 相关阅读:
    用GitHub Pages搭建博客(三)
    Beta阶段项目总结
    最终团队绩效评估
    Alpha阶段项目总结
    项目发布
    Alpha版总结会议
    第二次冲刺周期站立会议(10)
    第二次冲刺周期站立会议(9)
    第二次冲刺周期站立会议(8)
    第二次冲刺周期站立会议(7)
  • 原文地址:https://www.cnblogs.com/cs-whut/p/11141773.html
Copyright © 2011-2022 走看看