返回

函数与递归

发布时间:2023-08-15 15:18:06 206

​​https://stackoverflow.com​​​ 程序员的知乎,可以在上面提问题,回答问题

Github 也是程序员网站     剑指offer 上面有很多程序编程题目

函数递归

什么是递归?

程序调用自身的编程技巧成为递归。递归作为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或者间接调用自身的一种该方法,他通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小 的问题来求解,递归策略只需要少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量,递归的主要思考方式在于:把大事化小

递归的两个必要条件:

  • 存在限制条件,当满足这个限制条件的时候,递归便不再继续
  • 每次递归调用之后越来越接近这个限制条件

练习

1:

接受一个整型值(无符号),按照顺序打印它的每一位。例如:输入:1234,输出1 2 3 4 

#define _CRT_SECURE_NO_WARNINGS

#include

#include

void print(int x)

{

       if (x > 9)

       {

              print(x/10);

       }

       printf("%d ", x%10);

}

int main()

{

       int num = 0;

       printf("请输入一个数:\n");

       scanf("%d", &num);

       print(num);

       return 0;

}

函数与递归_#define

2.使用函数不允许创建临时变量,求字符串长度

  • 建立临时变量count的方法。arr是数组,数组在传参的时候,传过去的不是整个数组,而是第一个元素的地址

#define _CRT_SECURE_NO_WARNINGS

#include

#include

int my_strlength(char* num)

{

       int count = 0;

       while(*num != '\0')//此处是和字符‘\0’作比较,切勿不可写成字符串“\0”

       {

              count++;

              num++;

       }

       return count;

}

int main()

{

       char arr[] = "hellow bit !";

       int len = my_strlength(arr);

       printf("len=%d\n",len);

       return 0;

}

  • 不建立临时变量,用递归的方法实现

#define _CRT_SECURE_NO_WARNINGS

#include

#include

int my_strlength(char* num)

{

       

       if (*num != '\0')

       {

              1 + my_strlength(num+1);

              return 1 + my_strlength(num + 1);

       }

       else

          return 0;

}

int main()

{

       char arr[] = "hellow bit !";

       int len = my_strlength(arr);

       printf("len=%d\n",len);

       return 0;

}

3.递归与迭代

迭代类似于循环,在不停的做同一件事 

  • 用递归的方式实现求解n!

#define _CRT_SECURE_NO_WARNINGS

#include

#include

int mul(int x)

{

       if (x <= 1)

       {

              return 1;

       }

       else

       {

              return x * mul(x - 1);

       }

}

int main()

{

       int n = 0;

       int ret = 0;

       printf("请输入n:\n");

       scanf("%d", &n);

       ret = mul(n);

       printf("%d\n", ret);

       return 0;

}

  • 用递归的方法求费布那切数列  

费布那切数列是第一项和第二项都是1,从第三项开始,后面一项是前两项的和

1,1,2,3,5,8,13,21,35,55……

#define _CRT_SECURE_NO_WARNINGS

#include

#include

int feb(int n)

{

       if (n <= 2)

       {

              return 1;

       }

       else

       {

              return feb(n-1)+feb(n-2);

       }

}

int main()

{

       int n = 0;

       int ret = 0;

       printf("请输入n:\n");

       scanf("%d", &n);

       ret = feb(n);

       printf("%d\n", ret);

       return 0;

}

使用递归的方法是从后往前推,计算会使计算步骤变得复杂,计算量增多,导致结果出来的很慢

  • 使用迭代(循环)的方式计算  采用从前往后的计算方式,减少了计算量

#define _CRT_SECURE_NO_WARNINGS

#include

#include

int feb(int n)

{

       int a = 1;

       int b = 1;

       int c = 1;

       while (n > 2)

       {

              c = a + b;

              a = b;

              b = c;

              n--;

       }

       return c;

}

int main()

{

       int n = 0;

       int ret = 0;

       printf("请输入n:\n");

       scanf("%d", &n);

       ret = feb(n);

       printf("%d\n", ret);

       return 0;

}






特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
【C语言_12】初识数组 2023-08-15 12:16:32