C语言 函数和递归

递归:程序调用自身编程技巧称为递归。

最简单的递归:

#include <stdio.h>
int main()
{
	printf("hehe\n");
	main();
    return 0;
}

递归的常见错误:栈溢出 Stack Overflow

栈区:局部变量,函数参数

堆区:动态开辟的内存,malloc,calloc

静态区:全局变量,static修饰的变量

递归的两个必要条件:

1.存在限制条件,当满足这个限制条件的时候,递归便不再继续。

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

接受一个整形值(无符号),按照顺序打印它的每一位,例如:输入1234 输出1 2 3 4

#include <stdio.h>
void print(int n)
{
	if (n > 9)
	{
		print(n / 10);
	}
	printf("%d ", n % 10);      //print(1234)
}                               //print(123)4
int main()                      //print(12)34
{                               //print(1)234
	unsigned int num = 0;
	scanf_s("%d", &num);
	print(num);
	return 0;
}

编写函数,不允许创建临时变量,求字符串的长度。 

 

#include<stdio.h>
#include<string>
int main()
{
	char arr[] = "bit";
	int len = strlen(arr);
	printf("%d\n", len);
	return 0;
}

arr是数组,数组传参传过去的不是整个数组,而是第一个元素的地址。

 

#include<stdio.h>
int q(char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	char arr[] = "bit";
	int len = q(arr);
	printf("len=%d\n", len);
	return 0;
}

递归方法:

 

#include<stdio.h>
int q(char* str)
{
	if (*str != '\0')
		return 1 + q(str + 1);
	else 
		return 0;
	
}
int main()
{
	char arr[] = "bit";
	int len = q(arr);
	printf("len= %d\n", len);
	return 0;
}

递归与选代

求n的阶乘(不考虑溢出) 

 

#include<stdio.h>
int q(int n)
{
	int i = 0;
	int ret = 1;
	for (i = 1; i <= n; i++)
	{
		ret *= i;
	}
	return ret;
}
int main()
{
	int n = 0;
	int ret = 0;
	scanf_s("%d", &n);
	ret = q(n);
	printf("%d\n", ret);
	return 0;
}

 

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

斐波那契数列

1  1  2  3  5  8   13  21 .......

 

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

 

 简洁递归方法:

#include<stdio.h>
int q(int n)
{
	int a = 1;
	int b = 1;
	int c = 0;
	while (n > 2)
	{
		c = a + b;
		a = b;
		b = c;
		n--;
	}
	return c;
}
int main()
{
	int n = 0;
	int ret = 0;
	scanf_s("%d", &n);
	ret =q(n);
	printf("ret=%d\n", ret);
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值