有关递归与非递归的函数练习

1、递归和非递归分别实现求第n个斐波那契数。

2、编写一个函数实现n^k,使用递归实现

3、写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19

4、 编写一个函数reverse_string(char * string)(递归实现)
实现:将参数字符串中的字符反向排列。
要求:不能使用C函数库中
的字符串操作函数。

5、递归和非递归分别实现strlen
6、递归和非递归分别实现求n的阶乘
7、递归方式实现打印一个整数的每一位

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
int fib1(int n)//递归求斐波那契数
{
  if(n <= 2)
      return 1;
  else
      return fib1(n-1) + fib1(n-2);
}

int fib2(int n)//非递归求斐波那契数
{
    int a = 1;
    int b = 1;
    int sum = b;
    while(n>2)
      {
        sum = a + b;
        a = b;
        b = sum;
        n-- ;
      }
     return sum;
}
int Cifang1(int n, int k)//递归求n的k次方
{
   if(k == 0)
       return 1;
   else
   return n*Cifang1(n,k-1);

}
int Cifang2(int n, int k)//非递归求n的k次方
{
    int sum = 1;    
    if(k == 0)
         return 1;
    else
    {
     while(k--)
     {
         sum = sum*n;

     }
     return sum;
    }

}
int DigitSum1(int n)//递归求一个非负整数组成它的数字之和
{
    if(n < 10)
        return n;
    else
    return n%10 + DigitSum1(n/10);

}
int DigitSum2(int n)//非递归求一个非负整数组成它的数字之和
{
    int sum = 0;
    while(n)
    {
       if(n<10)
       {  
           sum = sum +n;
           break;
       }
       else
       {
           sum = sum + n%10;
           n = n/10;
       }
    }
    return sum;

}

char *reverse_string(char * string)//递归将参数字符串中的字符反向排列
{
    int n = 0;
    char temp;
    char *q;
    assert(string != NULL); 
    q = string;//q保存开始的p   
    while( *string != 0 )//计算出字符串的大小
    {
        n++;
        string++;
    }
    //保存第一个字符到一个变量中,
    //最后一个放到第一个的位置,
    //最后一个位置放'\0',以此类推
    if( n > 1)
    {
        temp = q[0];
        q[0] = q[n-1];
        q[n - 1] = '\0';
        reverse_string( q+1 );
        q[n - 1] = temp;
    }
    return q;
}
int my_strlen1(const char *q)//递归实现strlen函数
{
     assert(q != NULL);
     if(*q == '\0')
         return 0;
     else
     return 1 + my_strlen1(q+1);


}
int my_strlen2(char *q)//非递归实现strlen函数
{
    char *ret = q;
    assert(q != NULL);
    while(*q != '\0')
        q++;
    return q-ret;

}

int factorial1(int n)//递归实现n的阶乘
{
   if(n == 1)
       return 1;
   else
       return n * factorial1(n-1);


}
int factorial2(int n)//非递归实现n的阶乘
{
     int sum = 1;
     while(n > 1)
     {
        sum = sum * n;
            n--;
     }
    return sum;
}
void print(int n)//递归打印一个整数的每一位
{
    if(n > 9)
    { 
         print(n/10);
         printf("%d",n%10);
    }
    else
        printf("%d",n);

}
int main()
{    
    int k = 0;
    int n = 0;
    int ret = 0;
    char arr[] = "abcdefg";
    printf("请输入数字\n");
    scanf("%d",&n);
    ret = fib1(n);
    printf("%d\n",ret);

    printf("请输入数字\n");
    scanf("%d%d",&n,&k);
    ret = Cifang1(n,k);
    printf("%d\n",ret);

    printf("请输入数字\n");
    scanf("%d",&n);
    ret = DigitSum1(n);
    printf("%d\n",ret); 

    printf("%s", reverse_string(arr));
    printf("\n");

    ret = my_strlen1(arr);
    printf("%d\n",ret);

    printf("请输入数字\n");
    scanf("%d",&n);
    ret = factorial1(n);
    printf("%d\n",ret);

    printf("请输入数字\n");
    scanf("%d",&n);
    print(n); 
    printf("\n");

    return 0;
}

猜你喜欢

转载自blog.csdn.net/dream8834/article/details/80217418