递归练习

递归:程序调用自身,大事化小
递归条件:

  1. 要有限制条件,以便跳出递归,以防死循环
  2. 每次的递归调用都要接近那个限制条件

1、接受一个无符号整形值,把它转换为字符并打印它
例如:12345 —-> 1 2 3 4 5

//1234 5
//123 4 5
//12 3 4 5
//1 2 3 4 5
#include<stdio.h>
int fun(num)
{
    if(num>9)
    {
        fun(num/10);
    }
    printf("%d ",num%10);
}
int main()
{
    int num=12345;
    fun(num);
    return 0;
}

2、不创建临时变量,求字符串长度

#include<stdio.h>
int Strlen(const char *str)
{
    if(*str=='\0')
        return 0;
    else
        return 1+Strlen(str+1);
}
int main()
{
    char *p="qweasd";
    int len=Strlen(p);
    printf("len=%d\n",len);
    return 0;
}

3、求N的阶乘

#include<stdio.h>
int  factorial(n)
{
    if(n<=1)
        return 1;
    else
        return  n*factorial(n-1);
}
int main()
{
    int n=5;
    int ret = factorial(n);
    printf("%d\n",ret);
    return 0;
}

4、求第N个斐波那契数 1 1 2 3 5 8 13…

#include<stdio.h>
int fib(n)
{
    if(n<=2)
        return 1;
    else
        return fib(n-1)+fib(n-2);
}
int main()
{
    int n=10;
    int ret=fib(n);
    printf("%d\n",ret);
    return 0;
}

5、编写一个指数函数,实现n^k

#include<stdio.h>
#define a 3
#define b 5
int Index(int n,int k)
{
    if(k==1)
        return n;
    else
         return n * Index(n,k -1);
}
int main()
{
    int n=a;
    int k=b;
    printf("%d\n",Index(n,k));
    return 0;
}

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

#include<stdio.h>
int DigitSum(int n)
{
    if(n<10)
        return n;
    else
        return ((n % 10) + DigitSum(n / 10));
}
int main()
{
    int num=2017;
    int ret=DigitSum(num);
    printf("ret=%d\n",ret);
    return 0;
}

模拟递归
7、整数n的数字根如下定义:它是一个整数的所有数字的和,反复相加,直到只剩下一位数字为止:

  1. 2018—–>2+0+1+8=11
  2. 11 —–>1+1=2
#include<stdio.h>
int DigitalSum(int n)
{
    if(n<10)
        return n;
    else
        return (n%10)+(DigitalSum(n/10));
}
int DigitalRoot(int n)
{
    if(n<10)
        return n;
    else
        return DigitalRoot(DigitalSum(n));
}
int main()
{
    int num=2018;
    printf("%d\n",DigitalRoot(num));
    return 0;
}

8、编写一个函数reverse_string(char * string) 实现:将参数字符串中的字符反向排列

#include<stdio.h>
#include<assert.h>

int my_strlen(const char *p)
{
    assert(p);
    if (*p == 0)
        return 0;
    else
        return 1 + my_strlen(++p);
}

char *reverse_string(const char* p)
{
    assert(p);
    char *ret = p;
    if (*p != '\0')
    {
        reverse_string(++p);
    }
    printf("%c", *ret);
}
int main()
{
    char arr[] = "abcd1234";
    reverse_string(arr);
    printf("\n");
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值