当前位置:首页 » 《休闲阅读》 » 正文

C语言(函数的形参,实参,递归,迭代)_DENGGELADENG的博客

17 人参与  2022年02月14日 17:57  分类 : 《休闲阅读》  评论

点击全文阅读


#include<stdio.h>
#define _CRT_SECURE_NO_WARNINGS 
#include<string.h>
#include"add.h"


                                                 Q1: 计算两点欧几里得距离的函数:

#include<stdio.h>
#include<math.h>
double dist(double x1, double x2, double y1, double y2)
{
    return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}

int main()
{
    double x1 = 3.2;
    double x2 = 5.5;
    double y1 = 4.5;
    double y2 = 7.5;
    double dis=dist(x1, x2, y1, y2);
    printf("dist=%lf\n", dis);
    return 0;
}

C语言中的函数可定义为"返回类型 函数名(参数列表{函数体}),其中函数体的最后一条语句应该是return表达式"
有时,函数并不需要返回任何值,例如,它只是用printf向屏幕输出一些内容。这时只需定义函数返回类型为void,并且无须使用return(除非希望在函数运行中退出函数)。

                                               Q2:用函数交换变量的值(错误)

#include<stdio.h>
void exc(int x,int y)
{
    int t = x;
    x = y;
    y = t;
}
int main()
{
    int a = 10;
    int b = 20;
    printf("交换前,a=%d,b=%d", a, b);
    exc(a, b);
    printf("交换后,a=%d,b=%d", a, b);
    return 0;
}

                                        Q3:用函数交换变量的值(正确,用指针做参数)

#include<stdio.h>
void exc(int *x, int *y)
{
    int t = *x;
    *x = *y;
    *y = t;
}
int main()
{
    int a = 10;
    int b = 20;
    printf("交换前,a=%d,b=%d", a, b);
    exc(&a, &b);
    printf("交换后,a=%d,b=%d", a, b);
    return 0;
}

函数递归:大事化小,函数自己调用自己。
 程序调用自身的编程技巧成为递归,递归作为一种算法在程序设计中广泛应用。一个过程或函数在其定义域说明中有直接间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略。只需要少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
存在限制条件,当满足这个限制条件的时候,递归便不再继续。
每次递归调用之后越来越接近这个限制条件。

void print(unsigned int n)
{
    if (n > 9)
    {
        print(n / 10);
    }
    printf("%d ", n % 10);
}

int main()
{
 //接受一个整型值(无符号),按照顺序打印它的每一位
    unsigned int num = 0;
    scanf_s("%d", &num);//1234
    print(num);
    return 0;
}

编写函数,不允许创建临时变量,求字符串的长度
int my_strlen(char *s)
{
    int count = 0;
    while (*s != '\0')
    {
        s++;
        count++;
    }
    return count;
}
int main()
{
    char arr[10] = "abcdef";
    int len = my_strlen(arr);
    printf("count=%d", len);
    return 0;
}

创建了临时变量,递归解决一下:大事化小
my_strlen("abcd")
1+my_strlen("bcd")
1+1+my_strlen("cd")
1+1+1+my_strlen("d")
1+1+1+1+my_strlen("")
1+1+1+1+0=4

int my_strlen(char *s)
{
    if (*s != 0)
    {
        return 1 + my_strlen(1 + s);
    }
    else
    {
        return 0;
    }
}
int main()
{
    char arr[10] = "abcdef";
    int len = my_strlen(arr);
    printf("count=%d", len);
    return 0;
}

字符指针+1 - 向后跳1个字节
char *p;
p+1 -> 向后跳一个字节
整形指针+1,向后跳4个字节
int *p;
p+1 -->向后跳4个字节
指针+1都是指向下一个元素的位置,元素占多少字节,则跳过多少。

                                                        Q4:利用函数的递归和迭代求n!

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

                                                          Q5:求第n个斐波那契数

int count = 0;
int Fib1(int n)
{
    if (n == 3)
    {
        count++;
    }
    if (n > 2)
    {
        return Fib1(n - 1) + Fib1(n - 2);
    }
    else
        return 1;
}
int main()
{
    int n = 0;
    scanf_s("%d", &n);
    int ret = Fib1(n);
    printf("%d\n", ret);//斐波那契数值;
    printf("%d\n", count);//第3个斐波那契数计算的次数;
    return 0;
}

                                        Q6:另一种高效的斐波那契数求法(非递归,迭代)

int Fib2(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;
    scanf_s("%d", &n);
    int ret = Fib2(n);
    printf("%d\n", ret);//斐波那契数值;
    return 0;
}

什么时候用递归:
1.当解决一个问题递归和非递归都可以使用,且没有明显问题。那就可以使用递归。
2.当解决一个问题递归写起来很简单,非递归比较复杂,且递归没有明显问题,那就用递归。
3.用递归解决问题写起来简单但是有明显问题,就不能使用。
 


点击全文阅读


本文链接:http://zhangshiyu.com/post/34768.html

递归  函数  字节  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 你惹她干啥她疯起来嘎乱杀结局+番外+完结(楚瑶)全书浏览_你惹她干啥她疯起来嘎乱杀结局+番外+完结全书浏览
  • 高考分数出来那天,全家哭着求我原谅后续+番外_何思涵妹妹何思墨未删减_小说后续在线阅读_无删减免费完结_
  • 婚礼前夜未婚夫喂我安眠药,只为让养妹当新娘独家番外_许绍宁养妹全文_小说后续在线阅读_无删减免费完结_
  • 以身入局,我要掀翻这座城的天结局+番外+续集(程少云阮朵)_以身入局,我要掀翻这座城的天结局+番外+续集(程少云阮朵)
  • 出狱后,真千金手撕白莲杀疯了全文免费阅读无弹窗大结局_秦季姜沁最新章节列表_笔趣阁(出狱后,真千金手撕白莲杀疯了:完结+结局+番外)
  • 似锦的夫君停妻另娶挚友遗孀后,我杀疯了贺朝朝贺凌洲全书在线
  • 今夜雨将至(安佩项齐晟)_今夜雨将至
  • 暗恋逢光(江司聿夏未央)全书浏览_暗恋逢光全书浏览
  • 全文季总他图谋已久列表(秦韵季野)列表_全文季总他图谋已久列表
  • 重回高考前一天,我不再阻止同学们去参加班花组织的成人礼高口碑_林绾绾绾孟瑶故事会_小说后续在线阅读_无删减免费完结_
  • 全文最终还是失去你+结局(苏棠月靳延)列表_全文最终还是失去你+结局
  • 热文推荐心机美人攀高枝记:全文+番外(苏莞丝薛赜礼)书荒必看列表

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1