C————初接触的“递归思想”栗子

1.递归
函数内部自己调用自己
2.斐波那契数说明
1 1 2 3 5 8 13 21 34 55
从第三个数字开始,每一个数字都等于前两位的和

/*1.递归和非递归分别实现求第n个斐波那契数。*/
//递归方法
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int di_gui(int n)
{
    if (n <= 2)
    {
        return 1;
    }
    else
    {
        return di_gui(n - 1) + di_gui(n - 2);
    }
}
int main()
{
    printf("请输入你要求哪一位斐波那契数\n");
    int num = 0;
    scanf("%d", &num);
    printf("第%d个斐波那契数为%d\n",num,di_gui(num));
    system("pause");
    return 0;
}
// 1 1 2 3 5 8 13 21 34
//函数方法
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int di_gui(const int n)
{
    int a[100] = { 0 };
    int i = 0;
    a[0] = 1;
    a[1] = 1;
    for (i = 3; i <= n; i++)
    {
        a[i - 1] = a[i - 2] + a[i - 3];
    }
    return a[n - 1];
}
int main()
{
    printf("请输入你要求哪一位斐波那契数\n");
    int num = 0;
    scanf("%d", &num);
    printf("第%d个斐波那契数为%d\n",num,di_gui(num));
    system("pause");
    return 0;

}
/*2.编写一个函数实现n^k,使用递归实现 */
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int ci_fang(int n, int k)
{
    if (k == 1)
    {
        return n;
    }
    else
    {
        return ci_fang(n, k - 1)*n;
    }
}
int main()
{
    int n = 0, k = 0;
    printf("请输入你想要求的n^k中的n,k\n");
    scanf("%d %d", &n, &k);
    printf("所求值为:%d\n", ci_fang(n, k));
    system("pause");
    return 0;
}

/*3. 写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19 */
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int DigitSum(int num)
{
    if (num/10 == 0)
    {
        return num;
    }
    else
    {
        return (DigitSum(num / 10) + num % 10);
    }
}
int main()
{
    printf("请输入一个非负整数:\n");
    int n = 0;
    scanf("%d",&n);
    printf("%d",n);
    printf("该整数的各位和为%d\n", DigitSum(n));
    system("pause");
    return 0;
}
/*4. 编写一个函数reverse_string(char * string)(递归实现) 
实现:将参数字符串中的字符反向排列。 
要求:不能使用C函数库中 
的字符串操作函数。 */
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
char* reverse_string(char * string)
{
    char *top = string;
    char *end = string;
    while (*end)
    {
        end++;
    }
    end--;
    while (top < end)
    {
        int tmp = *top;
        *top = *end;
        *end = tmp;
        top++;
        end--;
    }
    return string;
}
int main()
{
    printf("输入字符串\n");
    char a[] = "0";
    scanf("%s", a);

    printf("反向排列后的字符串为:%s\n",reverse_string(a));
    system("pause");
    return 0;
}
/*5.递归和非递归分别实现strlen ,计算字符串长度*/
//函数方法
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int my_strlen(char * string)
{
    char * start = string;
    int count = 0;
    while (*(start++))
    {
        count++;
    }
    return count;
}
int main()
{
    printf("输入你想计算长度的字符\n");
    char num[] = "0";
    scanf("%s", num);
    printf("该字符串的长度为%d\n", my_strlen(num));
    system("pause");
    return 0;
}
//递归方法
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int my_strlen(char *string)
{
    char* start = string;
    if (!(*(start+1)))
    {
        return 1;
    }
    else
    {
        return my_strlen(string+1) + 1;
    }
}
int main()
{
    printf("输入你想计算长度的字符\n");
    char num[] = "0";
    scanf("%s",num);
    printf("该字符串的长度为%d\n",my_strlen(num));
    system("pause");
    return 0;
}
/*6.递归和非递归分别实现求n的阶乘*/ 
//函数方法
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int jie_cheng(int n)
{
    int i = 0,ret = 1;
    for (i = 1; i <= n; i++)
    {
        ret *= i;
    }
    return ret;
}
int main()
{
    printf("请输入一个正整数\n");
    int num = 0;
    scanf("%d", &num);
    printf("%d的阶乘为%d\n", num, jie_cheng(num));
    system("pause");
    return 0;
}
//递归方法
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int jie_cheng(int n)
{
    if (n == 1)
        return n;
    else
        return jie_cheng(n - 1)*n;
}
int main()
{
    printf("请输入一个正整数\n");
    int num = 0;
    scanf("%d", &num);
    printf("%d的阶乘为%d\n", num, jie_cheng(num));
    system("pause");
    return 0;
}
/*7.递归方式实现打印一个整数的每一位 */
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int da_yin(int num)
{
    if (num / 10 == 0)
    {   
        printf("%d ", num);
        return 0;
    }
    else
    {   

        da_yin(num / 10);
        printf("%d ", num % 10);
    }
}
int main()
{
    printf("请输入一个整数\n");
    int n = 0;
    scanf("%d", &n);
    printf("整数%d依次打印的结果是\n",n);
    da_yin(n);
    system("pause");
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值