递归 及 例题

递归:递延 和 回归

两个必要的条件:

1.存在限制条件

2.每次递归后越来越接近这个限制条件

青蛙跳台:每次可以跳一个台阶或者是两个台阶

想法在开始时可以选择跳1步或者两步,当台阶数x小于2时,输出为x,其他情况为f(x-1)+f(x-2);

代码:

#include<stdio.h>
int f(int x)
{
	if(x<=2)
		return x;
	return 	f(x-1)+f(x-2);
}

int main()
{
	int n=0;
	scanf("%d",&n);
	int s=0;
	s=f(n); 
	printf("%d",s);
	return 0;
}

编写函数求字符串长度不允许创建零时变量

1.创建了临时变量

#include<stdio.h>
int my_strlen(char* str)
{
	int count=0;
	while(*str!='\0')//字符串a b c \0
	{
		count++;
		str++;
	}
	return count;
	
}
int main()
{
	char arr[]="abc";
	int len=my_strlen(arr);
	printf("%d",len); 
	return 0;
}

可以采用递归的方式

#include<stdio.h>
int my_strlen(char* str)
{
	if(*str!='\0')
		return 1+my_strlen(str+1);//不能是str++如果是str++会先传str在加加一直不变
	else
		return 0;
		
	
}
int main()
{
	char arr[]="abc";
	int len=my_strlen(arr);
	printf("%d",len); 
	return 0;
}

n的阶乘

想法:原数字乘以前面的数字n*f(n-1),截至条件时n<=2时为2

#include<stdio.h>
int fac(int n)
{
	if(n<=2)
		return n;
	else
		return n*fac(n-1);
		
}
int main()
{
	int x;
	scanf("%d",&x);
	int s=fac(x);
	printf("%d",s);	
	return 0;
}

求第n个费波纳列数

想法:截至条件n<=2时返回还是1,费波纳列数时前面一项加上前面的前面的一项所以为f(n-1)+f(n-2)

#include<stdio.h>
int f(int n)
{
	if(n<=2)
		return 1;
	else
		return f(n-2)+f(n-1); 
}
int main()
{
	int n=0;
	scanf("%d",&n);
	int s=f(n);
	printf("%d",s); 
	return 0;
	
}

可以这样想,递归每个步骤的规律都相同。第一个人和第n个人的步骤都相同,而上面的第一个第二个正好不满足此步骤,因而可以为截至条件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值