C语言_递归练习

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

#include <stdio.h>
#include <stdlib.h>
void num1 (int *p, int n)//非递归求第n个数的斐波那契数的函数
{
    int i = 0;
    p[0] = 1;
    p[1] = 1;
    for (i=2; i<n; i++)
    {
        p[i] = p[i-2]+ p[i-1];
    }
}

int num2 (int n)//递归求第n个数的斐波那契数的函数
{
    if (n==1 || n == 2)
    {
        return 1;
    }
    else
    {
        return num2(n-1)+num2(n-2);
    }
}

int main()
{
    int arr[10];
    int i = 0, n = 0;
    scanf ("%d", &n);

    num1 (arr, n);
    printf ("第%d个斐波那契数是:%d(非递归)\n", n, arr[n-1]);

    num2 (n);
    printf ("第%d个斐波那契数是:%d( 递归)\n", n, num2(n));

    system ("pause");
    return 0;
}
/*
运行结果:
66个斐波那契数是:8(非递归)
第6个斐波那契数是:8( 递归)
请按任意键继续. . .
*/

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

#include <stdio.h>
#include <stdlib.h>
int jiechen(int n, int k)
{
    if (k == 0)
    {
        return 1;
    }
    else
    {
        return (n * jiechen(n, k-1));
    }
}
int main()
{
    int i = 0;
    int k = 0;
    printf ("i的k次方:\n");
    printf ("i = ");
    scanf ("%d", &i);
    printf ("k = ");
    scanf ("%d", &k);
    if (i<0)
    {
        printf ("输入有误!!\n");
    }
    else
    {
        printf ("%d%d次方是:%d\n", i, k, jiechen (i, k));
    }
    system ("pause");
    return 0;
}
/*
运行结果:
i的k次方:
i = 3
k = 3
33次方是:27
请按任意键继续. . .
*/

3、写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和

例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
#include <stdio.h>
#include <stdlib.h>
int DigitSum(int n)
{
    int sum = 0;
    while (n)
    {
        sum += n%10 ;
        n = n / 10;
    }
    return sum;
}
int main()
{
    int a = 0;
    scanf ("%d", &a);
    printf ("%d\n", DigitSum(a));
    system ("pause");
    return 0;
}
/*
运行结果:
1729
19
请按任意键继续. . .
*/

4. 编写一个函数reverse_string(char * string)(递归实现)

实现:将参数字符串中的字符反向排列。

要求:不能使用C函数库中的字符串操作函数。

思路:

定义一个char型变量ch,只要字符串string没有遇到 ‘\0’,就让ch等字符串首字符,然后让原本的首字符等于字符串最后一个字符,让最后一个字符等于’\0’,然后调用函数本身,参数为(string+1),从字符串第二个字符开始继续递归。这样就可以吧后半部分字符串移到前一部分,最后再把字符ch赋给字符串最后的一个字符,完成字符串反向排列。

这里写图片描述

#include <stdio.h>
#include <stdlib.h>

int length(char *p)//求字符串长度
{
    int i = 0;
    while (*p++)
    {
        i++;
    }
    return i;
}

void reverse_string(char * string)
{
    int n = length(string);
    char ch;
    if(!(*string))
    {
        return ;
    }
    else
    {
        ch = string[0];
        string[0] = string[n-1];
        string[n-1] = '\0';
        reverse_string(string +1);
        string[n-1] = ch;
    }
}

int main()
{
    char arr[] = {"abcdef"};
    printf ("变换前:\n");
    printf ("%s", arr);
    printf ("\n");
    reverse_string(arr);
    printf ("变换后:\n");
    printf ("%s", arr);
    printf ("\n");
    system ("pause");
    return 0;
}
/*
运行结果:
变换前:
abcdef
变换后:
fedcba
请按任意键继续. . .
*/

5.递归和非递归分别实现strlen

#include <stdio.h>
#include <stdlib.h>

int my_strlen(char *arr)//非递归求strlen
{
    int i = 0;
    for (i=0; arr[i]!='\0'; i++)
    {
        ;
    }
    return i;
}

int len_recursion (char *arr)
{
    if (*arr == '\0')
    {
        return 0;
    }
    else
    {
        return 1+len_recursion(arr+1);
    }
}
int main()
{
    char arr[] = {"abcdefgh"};
    int ret1 = my_strlen(arr);//非递归
    int ret2 = len_recursion (arr);//递归
    printf ("len = %d(非递归)\n", ret1);
    printf ("len = %d(递归)\n", ret2);
    system ("pause");
    return 0;
}
/*
运行结果:
len = 8(非递归)
len = 8(递归)
请按任意键继续. . .
*/

6.递归和非递归分别实现求n的阶乘

#include <stdio.h>
#include <stdlib.h>

int factorial(int a)//非递归算阶乘
{
    int i = 0, f = 1;
    for (i=1; i<=a; ++i)
    {
        f *= i;
    }
    return f;
}

int factorial_recursion(int a)//递归求阶乘
{
    if (a==0 || a==1)
    {
        return 1;
    }
    else
    {
        return a*factorial_recursion(a-1);
    }
}
int main()
{
    int a = 0;
    printf("请输入一个正整数:");
    scanf ("%d", &a);
    if(a<0)
    {
        printf ("输入错误!!\n");
    }
    else
    {
        printf ("%d的阶乘是:%d(非递归)\n", a, factorial(a));
        printf ("%d的阶乘是:%d(递归)\n", a, factorial_recursion(a));
    }
    system ("pause");
    return 0;
}
/*
运行结果:
请输入一个正整数:5
5的阶乘是:120(非递归)
5的阶乘是:120(递归)
请按任意键继续. . .
*/

7.递归方式实现打印一个整数的每一位

#include <stdio.h>
#include <stdlib.h>

void print_num(int n)//递归求每一位
{
    if(n>0&&n<10)
    {
        printf ("%d ", n);
    }
    else
    {
        print_num (n/10);
        printf ("%d ", n%10);


    }
}
int main()
{
    int n = 123456789;

    print_num(n);

    system ("pause");
    return 0;
}
/*
运行结果:
1 2 3 4 5 6 7 8 9 请按任意键继续. . .
*/

猜你喜欢

转载自blog.csdn.net/a__b__c__/article/details/80252621