-8≦x<2且x≠5在C语言中如何表达?,c语言%-2
(七)函数的递归1。什么是递归?调用程序自身的编程技巧;
或者过程函数在其定义或描述中有直接或间接调用自身的方法,将一个较大的复杂问题转化为一个与原问题相似的较小问题来求解;
主要在于:把大事化小。
最简单的递归:
#包含stdio.h
int main()
{
printf( 666 \ n );
main();
返回0;
}
为什么会出问题?
注意:
堆栈——局部变量,函数参数
在堆区域——中动态打开的内存
静态区域——全局变量,静态修改变量
运行中,堆栈区一直在为666申请空间,满了就会堆栈溢出。
(https://stackoverflow.com/相当于程序员的知乎)
2.必要条件是有限制的。当满足这个条件时,递归将不会继续;
每次调用后,它越来越接近这个限制。
3.练习3.1接受一个无符号整数值,并按顺序打印它的每一位# includesdio.h。
作废打印(整数)
{
如果(数字9)
{
打印(编号/10);
}
printf(%d ,编号% 10);
}
int main()
{
无符号int num=0;
scanf(%d ,编号);//num=1234
打印(数字);
//打印(1234)
//print(123) 4
//print(12) 3 4
//print(1) 2 3 4
//一个一个剥,逆来顺受。
返回0;
}
3.2写函数时不允许创建临时变量。求绳子的长度。#包含stdio.h
//#包含字符串. h
int my_strlen(char* str)
{
int count=0;
while(*str!=\0)
{
数数;
str
}
返回计数;
}
int main()
{
char arr[]= bit ;
//int ret=strlen(arr);
int len=my _ strlen(arr);//数组传递第一个元素的地址,所以函数不好用sizeof。
printf(%d ,len);
返回0;
}
不符合题意,创建count变量;
//逆来顺受
//my_strlen(bit )
//1 my_strlen(it )
//1 1 my_strlen(t )
//1 1 1 my_strlen( )
//1 1 1 0
//3
#包含stdio.h
int my_strlen(char* str)
{
if (*str!=\0)
返回1 my _ strlen(str 1);
其他
返回0;
}
int main()
{
char arr[]= bit ;
int len=my _ strlen(arr);
printf(%d ,len);
返回0;
}
(8)递归迭代的思想是反复做一件事。
1.求n的阶乘循环。
#包含stdio.h
整数因子
{
int I=0;
for(I=n-1;I 0;我-)
{
n=n * I;
}
返回n;
}
int main()
{
int n=0;
scanf(%d ,n);
int ret=Facl(n);
printf(%d\n ,ret);
返回0;
}
递归
#包含stdio.h
整数因子
{
如果(n=1)
返回1;
其他
return n=n * Facl(n-1);
返回n;
}
int main()
{
int n=0;
scanf(%d ,n);
int ret=Facl(n);
printf(%d\n ,ret);
返回0;
}
2.求第n个斐波那契数列# includesdio.h。
内部纤维(内部纤维)
{
如果(a=2)
返回1;
其他
返回光纤(a - 1)光纤(a-2);
}
int main()
{
int n=0;
int ret=0;
scanf(%d ,n);
ret=Fib(n);
printf(%d ,ret);
返回0;
}
程序可以求出斐波那契数,但当n=50时,作者的计算机输出结果需要7分钟左右,可见程序效率较低。
计算过程如下:
50
49 48
48 47 47 46
47 46 46 45 46 46 45 44
..
#包含stdio.h
int count=0;
内部纤维(内部纤维)
{
If (a==3) //查找第三个斐波那契数的次数
{
数数;
}
如果(a=2)
返回1;
其他
返回光纤(a - 1)光纤(a-2);
}
int main()
{
int n=0;
int ret=0;
scanf(%d ,n);
ret=Fib(n);
printf(%d\n ,ret);
printf(count=%d\n ,计数);
返回0;
}
通过计数器我们发现,在找到第四十个斐波那契数的时候,第三个斐波那契数被重复计算了3900多万次,足以看出程序的低效。
所以,并不是所有的东西都适合递归。
这里我们尝试使用循环。
中间纤维(中间纤维)
{
int a=1;
int b=1;
int c=1;
当(n 2)
{
c=a b;
a=b;
b=c;
n-;
}
返回c;
}
int main()
{
int n=0;
int ret=0;
scanf(%d ,n);
ret=Fib(n);
printf(%d\n ,ret);
返回0;
}
//结果可能会错(溢出),但是速度一定要快。注意:即使满足条件,递归有时也会溢出堆栈。
比如:
#包含stdio.h
无效测试(整数)
{
如果(n 10000)
{
测试(n 1);
}
}
int main()
{
测试(1);
返回0;
}独立研究:河内塔,青蛙跳台阶。
转载请联系作者授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。