C语言函数---递归与迭代

老子叫甜甜 提交于 2020-02-03 00:02:39

简单介绍C语言函数

C语言函数是一种函数,用来编译C语言,所在库函数为ctype.h,分为分类函数,数学函数,目录函数,进程函数,诊断函数,操作函数等。

从表面上看,函数在使用时必须带上括号,有必要的话还要传递参数,函数的执行结果也可以赋值给其它变量

对于库函数和自定义函数

C语言在发布时已经为我们封装好了很多函数,它们被分门别类地放到了不同的头文件中(暂时先这样认为),使用函数时引入对应的头文件即可。这些函数都是专家编写的,执行效率极高,并且考虑到了各种边界情况,各位读者请放心使用。

C语言自带的函数称为库函数(Library Function)。库(Library)是编程中的一个基本概念,可以简单地认为它是一系列函数的集合,在磁盘上往往是一个文件夹。C语言自带的库称为标准库(Standard Library),其他公司或个人开发的库称为第三方库(Third-Party Library)。

递归与迭代的区别

递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己.

一个函数在其定义中直接或间接调用自身的一种方法,它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,可以极大的减少代码量.递归的能力在于用有限的语句来定义对象的无限集合.

使用递归要注意的有两点:

1)递归就是在过程或函数里面调用自身;

2)在使用递归时,必须有一个明确的递归结束条件,称为递归出口.

迭代:利用变量的原值推算出变量的一个新值.如果递归是自己调用自己的话,迭代就是A不停的调用B.

递归中一定有迭代,但是迭代中不一定有递归,大部分可以相互转换.能用迭代的不用递归,递归调用函数,浪费空间,并且递归太深容易造成堆栈的溢出.

下面举些函数调用的例子包括递归函数与迭代函数的应用。

  1. 实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定

如:输入9,输出99口诀表,输出12,输出1212的乘法口诀表。

#define _CRT_SECURE_NO_WARINGS 1

#include<stdio.h>
int main()
{
int i = 0, j = 0, input = 0;
scanf_s("%d", &input);
for (i = 1; i <= input; i++)
{
for (j = 1; j <= i; j++)
printf("%dx%d=%d ", i, j, i * j);
printf("\n");
}
return 0;
}
  1. 实现函数判断year是不是润年。

要求:利用上面实现的函数打印1000到2000年的闰年。

#define _CRT_SECURE_NO_WARINGS 1

#include<stdio.h>

void print_run_year(int year);

int main()

{

int year = 0;

for (year = 1000;year <= 2000;year++)

print_run_year(year);

return 0;

}

void print_run_year(int year)

{

if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))

printf("%d是闰年  ", year);

}




  1. 实现一个函数,判断一个数是不是素数。

要求:利用上面实现的函数打印100到200之间的素数。

#define _CRT_SECURE_NO_WARINGS 1

#include<stdio.h>

void print_sushu(int i);

int main()

{

int i = 0;

for (i = 100;i <= 200;i++)

print_sushu(i);

return 0;

}

void print_sushu(int i)

{

int j = 0;

for (j = 2;j < i;j++)

if (i % j == 0)

break;

else

{

printf("%d ", i);break;

}

}

递归与迭代函数的应用。

  1. 递归和非递归分别实现求第n个斐波那契数

例如:

输入:5 输出:5

输入:10, 输出:55

输入:2, 输出:1

#define _CRT_SECURE_NO_WARINGS 1

#include<stdio.h>

int Fib(int i);

int main()

{

int i = 0;

int num = 0;

printf("输入要求的数字\n");

scanf_s("%d", &i);

num = Fib(i);

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

return 0;

}

int Fib(int i)//递归写法

{

if (i <= 2)

return 1;

else

return Fib(i - 1) + Fib(i - 2);

}







#define _CRT_SECURE_NO_WARINGS 1

#include<stdio.h>

int Fib(int i);

int main()

{

int i = 0;

int num = 0;

printf("输入要求的数字\n");

scanf_s("%d", &i);

num = Fib(i);

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

return 0;

}

int Fib(int i)//非递归写法

{

int j = 0, k = 0,m=0,n=0;

if (i <= 2)

return 1;

else

{

for (j = 1, k = 1, m = 1;k <= i - 2; k++, j = m, m = n)

{

n = j + m;

}

return n;

}

}


  1. 编写一个函数实现n的k次方,使用递归实现。

要求:k可以正数或负数

#define _CRT_SECURE_NO_WARINGS 1

#include<stdio.h>

float print_nk(int n,int k);

int main()

{

int n = 0,k = 0;

float num = 0;

printf("输入分别为n的k次方\n");

scanf_s("%d%d", &n, &k);

num=print_nk(n, k);

printf("%f\n", num);

return 0;

}

float print_nk(int n, int k)

{

if (k == 0)

return 1;

else if (k > 0)

return n * print_nk(n, k - 1);

else

return (1.0 / n) * print_nk(n, k + 1);



}




  1. 写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和

例如:调用DigitSum(1729),则应该返回1+7+2+9,它的和是19

输入:1729,输出:19

#define _CRT_SECURE_NO_WARINGS 1

#include<stdio.h>

int DigitSum(int n);

int main()

{

int i = 0;

int num = 0;

scanf_s("%d", &i);

num = DigitSum(i);

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

return 0;

}

int DigitSum(int n)

{

    int m=0;

if (n < 10)

return n;

else

m = n % 10;

return m + DigitSum(n / 10);

}


  1. 编写一个函数 reverse_string(char * string)(递归实现)

实现:将参数字符串中的字符反向排列。

要求:不能使用C函数库中的字符串操作函数。

#define _CRT_SECURE_NO_WARINGS 1

#include<stdio.h>

void reverse_string(char * string,int length);

int main()

{

char str[] = "abcde";

int length = 5;

reverse_string(str,length);



return 0;

}

void reverse_string(char * string,int length)

{

if (length > 0)

{

printf("%c", string[length - 1]);

reverse_string(string, length - 1);

}

else

printf("\n");

}





#include<stdio.h>

int Sumstrlen(char *str);

int main()

{

int sum = 0;

char str[] = {0};

printf("输入字符串\n");

scanf("%s", str);

sum = Sumstrlen(str);

printf("字符个数为%d\n", sum);

return 0;

}

int Sumstrlen(char *str)

{

if (*str != '\0')

return 1 + Sumstrlen(str+1);

else

return 0;

}




  1. 递归和非递归分别实现strlen。
#include<stdio.h>

int Sumstrlen(char *str);

int main()

{

int sum = 0;

char str[] = {0};

printf("输入字符串\n");

scanf("%s", str);

sum = Sumstrlen(str);

printf("字符个数为%d\n", sum);

return 0;

}

int Sumstrlen(char *str)

{

if (*str != '\0')

return 1 + Sumstrlen(str+1);

else

return 0;

}


由此可见我们发,在我们编写代码是运用函数可以极大的减小我们代码的复杂程度,在函数中适当的运用=递归与迭代思维可以帮助我们解决好多复杂问题。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!