递归
○ 算法思想:
递归算法分为两大阶段 : 递和归,即就是有去(递去)有回(归来)。
- 递去:将递归问题分解为若干个规模较小,与原问题形式相同的子问题,这些子问题可以用相同的解题思路来解决。
- 归来:当你将问题不断缩小规模递去的时候,必须有一个明确的结束递去的临界点(递归出口),一旦达到这个临界点即就从该点原路返回到原点,最终问题得到解决。
○ 递归的要素:
- 递归终止的条件
- 递归操作
○ 案例应用:
猴子吃桃问题
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>int main() {//递归的要素1.递归终止的条件// 2.递归操作//递归函数(语义--[参数列表])//猴子吃桃问题:有一堆桃,第一天吃了一半,觉得好吃多吃了一个,第二天吃了剩下的一半,觉得好吃又多吃了一个,第三天....第四天剩了一个,问一共多少桃子?printf("输入天数:");int days = 0;scanf("%d", &days);int nums = monkeyEatPeach(days);printf("有%d桃子\n", nums);return 0;}//递归函数int monkeyEatPeach(int day) { //倒数天数//终止条件if (day == 1) {return 1;}//递归操作return (monkeyEatPeach(day - 1) + 1) * 2;return 0;}
求一个数的阶乘
#define _CRT_SECURE_NO_WARNINGS 1 /* 求n! */
#include <stdio.h>
//声明一个函数wn,来求阶乘
int wn(int n) {//递归终止条件if (n == 0 || n == 1) {return 1;}//递归操作return n * wn(n - 1);
}
int main() {int n = 0;printf("请给n赋值:");scanf("%d", &n);printf("%d!=%d\n", n, wn(n));//调用函数return 0;
}
查找斐波那契数列的某一项
#define _CRT_SECURE_NO_WARNINGS 1//斐波那契数列(查找第n项)
#include<stdio.h>
int fib(int n) {//终止条件if (n == 1|| n == 2) {return 1;}//递归操作return(fib(n - 1) + fib(n - 2));
}
int main() {int n = 0;printf("请输入要查找的项数n:");scanf("%d", &n);int res = fib(n); //调用函数printf("斐波那契数列的第%d项 = %d\n", n, res);return 0;
}
函数
● 知识回顾 :
○ 一个函数只能完成一个功能.
○ 定义函数:
返回值类型 函数名 (参数列表){
函数体
}
○ 定义函数的作用 :代码复用
模块化开发
○ 函数是不能嵌套定义的,但能嵌套调用.
○ 函数的链式访问:将函数的返回值作为另一个函数返回值的参数.
○ 常用库函数
查函数文档 : http://www.dotcpp.com/course/lib/
数组
○ 知识回顾 :
• 数组的访问 : 数组名[索引]
• 数组名指的是数组中首元素的地址 ;
有两个特殊:数组名指的是整个数组: 1. &数组名 2. sizeof(数组名)
• 地址的运算 : 地址+(-)n (地址偏移n个元素的大小)
• 数组在内存中连续分配空间,基于这个特点: arr + n ==> &arr[n] arr[n] = *(arr+n) ;
• 在使用数组时,注意越界问题 ( 索引[0 , length-1] )
• 如何计算长度? sizeof(arr) / sizeof(arr[0]) ;
• 数组作为参数? function( 数组名 , length ) ; function(int* arr,int length);
• 在函数中是否可以获取数组的长度? 不行