函数递归&实例

/*
函数递归:
什么是函数递归?
程序调用自身的编程技巧称为递归。
递归作为一种算法在程序设计语言中广泛应用;
一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法;
通常把一个大型复杂的问题层层转化为一个与原问题相似规模较小的问题来求解,递归策略只需少量的程序就可描述出解决过程
所需要的多次重复计算,大大的减少了程序的代码量。
递归的主要思考方式:把大事化小
递归的两个必要条件
A.存在限制条件,当满足这个限制条件的时候,递归便不再继续
B.每次递归调用之后便越来越接近这个限制条件
 Exercise  A 接收一个无符号整形,按照顺序打印它的每一位 EG:输入1234 输出1 2 3 4

#include <stdio.h>
void print(int n)
{
    if(n>9)
    {
        print(n/10);
    }
    printf("%d ", n%10);
}
int main()
{
    int num = 0;
    printf("请输入你所要打印的数\n");
    scanf("%d",&num);
    print(num);
    return 0;
}

 Exercise  B 求一个字符串的长度
 先了解指针变量的意思
#include <stdio.h>
int main()
{
    int a=0;//a是int类型,在内存中分配4个字节的空间
    printf("%p\n",&a);//%p是专门来打印地址的
    int *pa=&a;//pa是用来存放地址的,pa叫指针变量
    // *说明pa是指针变量
    //int说明pa指向的对象是int类型的
    return 0;
}
调用库函数运用链式访问轻松求出arr字符串的长度
 #include <stdio.h>
#include <string.h>
int main()
{
    char arr[]="Treasure";
    printf("%d",strlen(arr));
    return 0;
}
 写一个函数来求一个字符串的长度
#include <stdio.h>
int mystrlen(char *str)
{
    int number=0;
    while (*str != '\0')
    {
        str++;
        number++;
    }
    return number;
}
int main()
{
    char arr[]="Treasure";
    printf("%d",mystrlen(arr));
    //数组名相当于首元素的地址,即T的地址,数组名在传参的时候,传的是首元素的地址,
    //T是字符,所以是字符的地址char *str
    //字符的地址要放在字符的指针变量里面*str
    return 0;
}

写一个程序不允许创建临时变量来求一个字符串的长度
 #include <stdio.h>
int mystrlen(char *str)
{
    if (*str != '\0')
        return 1+mystrlen(str+1);
    else
        return 0;
}
int main()
{
    char arr[]="Treasure";
    printf("%d",mystrlen(arr));
    return 0;
}
递归与迭代
求n的阶乘(不考虑溢出)
#include <stdio.h>
int main()
{
    int n=0;
    scanf("%d",&n);
    int ret=1;
    for (int i = 1; i <=n ; i++)
    {
        ret=ret*i;
    }
    printf("%d\n",ret);
    return 0;
}
 int fan(int i)
{
    if (i<=1)
        return 1;
    else
        return fan(i-1)*i;
}
#include <stdio.h>
int main()
{
    int n=10;
    fan(n);
    printf("%d",fan(n));
    return 0;
}
计算第n个斐波那契数(不考虑溢出)//递归的次数太多
 int fib(int i)
{
    if (i<=2)
        return 1;
    else
        return fib(i-1)+fib(i-2);
}
#include <stdio.h>
int main()
{
    int n=0;
    scanf("%d",&n);
    fib(n);
    printf("%d", fib(n));
}
 int fib(int i)
{
    int a=1;
    int b=1;
    int c=1;
    while (i>2)
    {
        c=a+b;
        a=b;
        b=c;
        i--;
    }
    return c;
}
#include <stdio.h>
int main()
{
    int n=0;
    scanf("%d",&n);
    fib(n);
    printf("%d", fib(n));
}
计算一道例题:
 long fact(int n)
{
    long f;
    if (n==1)
        f=1;
    else
        f=n*fact(n-1);
    return f;
}
#include <stdio.h>
int main()
{
    long y;
    int m;
    printf("请输入一个正整数:\n");
    scanf("%d",&m);
    y=fact(m);
    printf("%d != %ld\n",m,y);
    return 0;
}
*/

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值