C语言-第36课 - 函数递归与函数设计技巧

第36课 - 函数递归与函数设计技巧

一. 递归

  1. 递归概述

(1) 递归是数学领域中的概念在程序设计中的应用。

(2) 递归是一种强有力的程序设计的方法。

(3) 递归的本质为函数内部在适当的时候调用自身。

  1. 组成部分

(1)递归点:以不同参数调用自身。

(2)出口:不在递归调用

下面就是求一个数的阶乘的函数:

#include <stdio.h>

int func(int x)

{

if( x > 1 )

{

return x * func(x - 1);  //递归点

}

else

{

return 1;    //出口

}

}

int main()

{

printf("x! = %d\n", func(4));

return 0;

}

运行结果:4!= 24

虽说调用了一次,却创建了4次活动记录。所以说我们的递归函数不能递归太多的层次。

小结:

C语言中的递归函数必然会使用判断语句。

递归函数在需要编写的时候定义函数的出口,否则栈会溢出。

递归函数是一种分而治之的思想。

思考题:编写一个函数打印一个字符数组的全排列。

void Permutation(char *pStr,char *pBegin)
{
 assert(pStr&&pBegin);
 if(*pBegin == ‘\0‘) 
  printf("%s\n",pStr);   
 else 
    {        
  for(char *pCh=pBegin; *pCh !=‘\0‘; pCh++) 
       { 
   char temp = *pCh;
   *pCh = *pBegin;
   *pBegin = temp;

Permutation(pStr, pBegin+1); 
   temp = *pCh;
   *pCh = *pBegin;
   *pBegin = temp;
  } 
    } 
}

二. 函数的设计技巧

  1. 不要在函数中使用全局变量,尽量让函数从意义上是一个独立的功能模块。
  2. 参数名要能够体现参数的意义。

void str_copy(char *str1, char *str2);

void str_copy(char *str_dest, char *str_src);

  1. 如果函数是指针,且仅作为输入参数用,则应在类型前加const,以防止该指针在函数体内被意外修改。

void str_copy(char *str_dest, const char *str_src);

  1. 不要省略返回值的类型,如果函数没有返回值,那么应该声明为void类型。
  2. 在函数体的“入口处”,对参数的有效性进行检查,对指针的检查尤为重要。
  3. 语句不可返回指向“栈内存”的“指针”,因为该内存在函数体结束时被自动销毁。
  4. 函数体的规模小,尽量要控制在80行代码之内。
  5. 相同的输入应当产生相同的输出,尽量避免函数带有“记忆”功能。
  6. 避免函数有太多的参数,参数的个数尽量控制在4个以内。
  7. 有时候函数不需要返回值,但是为了增加灵活性,加支持链式表达,可以附加返回值:

char s[64];

int len = strlen(strcpy(s,”android”));

  1. 函数名与返回值类型在语义上不可以冲突

char c;

c = getchar();  //getchar的返回值是int不是char。

if(EOF==c)   //会出错,永远不会进入。

{   //...  }

原文地址:https://www.cnblogs.com/free-1122/p/9826649.html

时间: 2024-10-13 02:04:05

C语言-第36课 - 函数递归与函数设计技巧的相关文章

4/2 三元表达式/函数递归/匿名函数/内置函数

三元表达式 def max2(x,y) if x > y: return x else return y res=max2(10,11) 三元表达式仅应用于: 1 条件成立返回一个值 2 条件不成功返回一个值 def max2(x,y): return x if x>y else y print (max2(2,10)) 10 函数递归:函数的递归调用,即在函数调用的过程中,又直接或间接地调用了函数的本身. 直接调用 def foo(): print ('fffff') foo() 间接调用

函数递归+匿名函数+内置函数day15

一.函数递归 什么是函数递归: 函数递归调用是一种特殊的嵌套调用,在调用一个函数的过程中,又直接或间接地调用了该函数本身. 其中,函数的递归有明确的结束条件,不能无限制的调用,否则会撑破内存,在Python中限定递归最多调用1000层. 1000层这个值是大概的数值,这个数值可以通过Python内置的功能进行更改. 递归必须要有两个明确的阶段: 递推:一层层递归调用下去,强调每次进入下一次递归,问题规模都在减小 回溯:递归必须要有一个明确的结束条件,在满足该条件时结束递推,开始一层层回溯 其中,

python_函数递归

函数递归 函数递归:函数的递归调用,即在函数调用的过程中,又直接或间接地调用了函数本身 # import sys # print(sys.getrecursionlimit()) # sys.setrecursionlimit(10000) # print(sys.getrecursionlimit()) 直接调用 def foo(): print('from foo') foo() foo() 间接调用 def bar(): print('from bar') foo() def foo():

十一、函数递归,算法二分法,三元表达式,列表字典生成式,匿名函数,内置函数

一.函数递归: 函数的递归:函数在调用阶段直接或间接的又调用自身 递归分为两个阶段 1.回溯:就是一次次重复的过程,这个重复的过程必须建立在每一次重复问题的复杂度都应该下降 直到有一个最终的结束条件 2.递推:一次次往回推导的过程 3.递归函数在运行过程中一定要有出口,否则会无限循环下去 # 1.求4以内的和: def sum_numbers(num): if num == 1: return 1 return num + sum_numbers(num - 1) # 递归特点:函数内部自己调用

C语言-第33课 - 认清函数的真面目

第33课 - 认清函数的真面目 一.概念 函数的由来 程序 = 数据 + 算法 C程序 = 数据 + 函数 我们下面分析一下汇编语言,汇编语言是从上到下顺序执行的,汇编为了循环执行,就有了跳转指令.通过来回的跳转,就存在了不同的功能模块,这也就是我们C语言中的函数的原型. 函数的意义 模块化程序设计: C语言中的模块化: 面向过程的程序化设计 (1) 面向过程是一种以过程为中心的编程思想. (2) 首先将复杂的问题分解为一个个容易解决的问题. (3) 分解过后的问题可以按照步骤一步步完成. (4

第36课 函数与指针分析

1. 函数类型 (1)C语言中的函数有自己特定的类型,这个类型由返回值.参数类型和参数个数共同决定.如int add(int i,int j)的类型为int(int,int). (2)C语言中通过typedef为函数类型重命名 typedef type name(parameter list);//如typedef int f(int,int); 2. 函数指针 (1)函数指针用于指向一个函数,函数名是执行函数体的入口地址. (2)定义函数指针的两种方法 ①通过函数类型定义:FuncType*

c语言函数, 函数调用及函数递归

1. 函数的定义: 返回值类型 函数名(形参列表) {函数体(函数的实现内容)}, 注意: 如果没有参数, 小括号也是必不可少的.  函数与函数之间可以嵌套调用(也就是在一个函数内部可以调用另外一个函数), 但是不能嵌套定义(不能在一个函数内部定义另外一个函数) 形参: 形式上的参数, 在函数定义时, 给定的参数叫做形参, 是一个一个的变量, 存储的数据在调用之前完未知 实参: 函数调用时给定的参数叫做实参, 是一个唯一确定的数据. 实参向形参传递的过程是一个拷贝的过程 函数相当于公司的部门,

Go语言核心36讲

Go语言核心36讲 其它学习课程目录: 其它学习课程目录: 从0开始学微服务 面试官绝杀:系统是如何支撑高并发的? 分布式技术原理与算法解析 消息队列高手课 从0开始学架构 微服务架构实战160讲 网络编程实战 01 | 工作区和GOPATH gopath指的是工作空间(包括源码,可以有多个) 构建使用命令go build,安装使用命令go install.构建和安装代码包的时候都会执行编译.打包等操作,并且这些操作生成的任何文件都会先被保存到某个临时的目录中. go install命令安装的是

iOS函数,函数递归

#import <Foundation/Foundation.h> #import "Function.h" int main(int argc, const char * argv[]) { //函数定义 /*返回值类型 函数名(参数1, 参数2, 参数3, 参数4) { 函数体; return 返回值; } */ //函数四种基本类型: //无参无返回值 //实参 到形参的过程是一个拷贝的过程 //函数的值,要哟过对应的数据类型进行接收 //c语言允许函数嵌套调用,不允