首页 > 其他分享 >函数(2)递归

函数(2)递归

时间:2023-12-07 22:00:48浏览次数:28  
标签:return 函数 递归 int ret str strlen

一、函数递归

什么是递归

程序调用自身的编程技巧称为递归(recursion)。递归作为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可以描述出解题过程所需要的多次重复计算,大大的减少了程序的代码量。递归的主要思考方式在于:把大事化小。

递归常见出现的问题就是栈溢出。

递归的两个必要条件

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

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

e.g.1 打印一个数各个位上的数值

void print(int n)
{
	if (n > 9)
		print(n / 10);
	printf("%d ", n % 10);
}

int main()
{
	unsigned int num = 0;
	scanf("%d", &num);//1234
	print(num);
	return 0;
}

e.g.2.1 模拟实现strlen函数(用循环)

int my_strlen(char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}

int main()
{
	char arr[] = "bit";
	printf("len=%d\n", my_strlen(arr));
}

e.g.2.2 模拟实现strlen函数(用递归)

int my_strlen(char* str)
{
	if (*str != '\0')
		return 1+my_strlen(str + 1);
	else
		return 0;
}

int main()
{
	char arr[] = "bit";
	printf("len=%d\n", my_strlen(arr));
}

e.g.3.1 输入一个数,求其阶乘的值(用循环)

int fac1(int n)
{
	int i = 0;
	int ret = 1;
	for (i = 1; i <= n; i++)
	{
		ret *= i;
	}
	return ret;
}

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

e.g.3.2 输入一个数,求其阶乘的值(用递归)

int fac2(int n)
{
	if (n <= 1)
		return 1;
	else
		return n * fac2(n - 1);
}

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

e.g.4.1  求第n个斐波那契数的值(用递归)

int fib(int n)
{
	if (n <= 2)
		return 1;
	else
		return fib(n - 1) + fib(n - 2);
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	printf("%d\n", fib(n));
}

e.g.4.2 求第n个斐波那契数的值(用循环)

这里之所以不用递归是因为递归会重复计算n之前的所有斐波那契数,造成极大的算力的浪费,当n>44后效率极低。

int fib2(int n)
{
	int count = 0;
	int a = 1;
	int b = 1;
	int ret = 1;
	while (n>2)
	{
			n--;
			ret = a + b;
			a = b;
			b = ret;
	}
	return ret;
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	printf("%d\n", fib2(n));
}

标签:return,函数,递归,int,ret,str,strlen
From: https://blog.51cto.com/u_16292010/8728070

相关文章

  • 无涯教程-Erlang - spawn函数
    这用于创建新进程并对其进行初始化。spawn-语法spawn(Function)Function - 需要产生的功能。spawn-返回值此方法返回一个进程ID。-module(helloLearnfk).-export([start/0]).start()->spawn(fun()->server("Hello")end).server(Message)->io:f......
  • 递归
    @OverridepublicList<CategoryEntity>listWithTree(){//1、查询所有分类List<CategoryEntity>entities=baseMapper.selectList(null);//2、组装成树状的父子结构//查出所有的一级分类List<CategoryEntity>collect=entities.stream().filter(categoryEntity->cate......
  • 【OpenSSL】哈希、非对称加密和对称加密函数使用
    1.哈希1.1md5的使用头文件#include<openssl/md5.h>#include<openssl/sha.h>MD5散列值的长度#defineMD5_DIGEST_LENGTH16//根据这个分配一块空内存保存散列值初始化MD5->给MD5传入运算的数据(可以多次传入)->计算MD5#defineMD5_DIGEST_LENGTH1......
  • 无涯教程-Erlang - unregister函数
    这用于注销系统中的进程。unregister-语法unregister(atom)atom-这是要赋予该过程的注册名称。unregister-示例-module(helloLearnfk).-export([start/0,call/2]).call(Arg1,Arg2)->io:fwrite("~p~n",[Arg1]).start()->Pid=spawn(?MODULE,cal......
  • cgo:go数组转c数组调用c函数
    packagemain/*#include<stdio.h>voidprocessInt2DArray(int*arr,introws,intcols){for(inti=0;i<rows;i++){for(intj=0;j<cols;j++){printf("%d",*(arr+i*cols+j));}......
  • 关键字 开发-10 封装引用自定义函数变量
    前言前面在yaml文件中引用内置函数以及自定义函数和变量时,都是在每个关键字后面进行单独得渲染,为了方便引用,于是我们单独对这块的内容进行封装。1.新增自定义函数和变量在utils下新建自定义函数和变量的文件,my_builtins.py,新增了在接口中需要用到的一些变量和函数。这样,在传......
  • 无涯教程-Erlang - register函数
    这用于在系统中注册进程。register-语法register(atom,pid)atom-这是要赋予该过程的注册名称。pid  -这是需要绑定到原子的进程ID。register-示例-module(helloLearnfk).-export([start/0,call/2]).call(Arg1,Arg2)->io:fwrite("~p~n",[Arg1]).......
  • 转:ROW_NUMBER() OVER函数的基本用法
    ROW_NUMBER()OVER函数的基本用法 分组后排序    在oracle中分组倒叙排序,取出每一组的第一个值,如何通过ROW_NUMBER()OVER实现 ChatGPTChatGPT在Oracle中,你可以使用ROW_NUMBER()窗口函数结合PARTITIONBY和ORDERBY子句来实现......
  • 无涯教程-Erlang - is_pid函数
    此方法用于确定进程ID是否存在。is_pid-语法Is_pid(processid)processid  - 这是需要检查的进程ID,是否存在。is_pid-返回值如果进程ID存在,则返回true,否则将返回false。-module(helloLearnfk).-export([start/0,call/2]).call(Arg1,Arg2)->io:format("......
  • python高级之函数的定义和调用
    Python函数的定义和调用函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。定义一个函数你可以定义一个由自己想要......