函数递归学习1
#include <stdio.h>
//函数递归,直接或间接调用自身的一种方法,主要目的:大事化小
void print(int n)
{
if(n>9)//有限制条件(n>9)的递归,否则会无限stack overflow
print(n/10);//每次递归调用后越来越接近限制条件
printf("%d ",n%10);
}
int main()
{
unsigned int num=0;
//scanf("%d",&num);
num=123;
print(num);
return 0;
}
函数递归学习2
写代码:求字符串长度(一般写法
#include <stdio.h>
int my_strlen(char*str)
{
int count=0;
while((*str) != '\0')//递归的条件
{
count++;
str++;//str加一,相当于数组指向的元素向右移一个,不断接近限制条件
}
return count;//有返回值count
}
int main()
{
char arr[] = "bit";//字符串,结束标志是\0
int len = my_strlen(arr);
//设置my_strlen的函数,这里arr数组传参,传的不是数组,传的是第一个元素的地址,所以前面要用指针
printf("len=%d\n",len);
return 0;
}
递归做法
#include <stdio.h>
int my_strlen(char* str)
{
if((*str) != '\0')//*str指数组元素,str+1中的str指的是数组地址,所以是str加而没有用解引用
return 1+my_strlen(str+1);//这里返回的内容注意,没有创建临时变量
else
return 0;
}
int main()
{
char arr[] = "bit";
int len = my_strlen(arr);
printf("len=%d\n",len);
return 0;
}
//my_strlen('bit')
//1+my_strlen('it')
//1+1+my_strlen('t')
//1+1+1+my_strlen('')这个是递归的过程
学习3
求n的阶乘(一般方法,循环做
#include <stdio.h>
int main()
{
int i;
//scanf("%d ",&i);
i=4;
int n=1;
int sum=1;
while(n<=i)
{ sum=n*sum;//sum*=n;
n++;
}
printf("%d\n",sum);
return 0;
}
递归做法
#include <stdio.h>
int Fac(int i)
{
if(i<=1)
return 1;//这里如果i到1了思考需要怎么返回
else
return i* Fac(i-1);
}
int main()
{
int i;
//scanf("%d ",&i);
i=3;
int sum =Fac(i);
printf("%d\n",sum);
return 0;
}
学习4
斐波那契数列(递归方法,求很大的数时反而不合适
#include <stdio.h>
int Fib(int i)
{
if(i<=2)
return 1;
else
return Fib(i-1)+Fib(i-2);
}
int main()
{
int i;
//scanf("%d ",&i);
i=3;
int ret = Fib(i);
printf("%d ",ret);
return 0;
}
循环做法(之前写过
//什么时候用递归,什么时候用循环?
//递归可能会存在栈溢出stack overflow、影响效率(有两个限制条件:限制条件+每次递归调用后越接近限制条件),感受选择即可。总之要保证两个代码的正确性