C语言-递推递归

合集下载

C++函数、递推、递归ppt课件

C++函数、递推、递归ppt课件

i = 7 s1 = 2 * (s2 + 1) ; s2 = s1 ;
// S(7) = 2 * (S(8) + 1) // s2 = s1 = S(7)
i = 6 s1 = 2 * (s2 + 1) ; s2 = s1 ;
// S(6) = 2 * (S(7) + 1) // s2 = s1 = S(6)
看一个简单的例子:
1 4
第九讲——函数、递推、递归
递归
有 5 个人坐在一起,问第 5 个人多少岁? 他说比第 4 个人 大两岁。问第 4 个人岁数,他说比第 3 个人大两岁。问第 3 个人,又说比第 2 个人大两岁。问第 2 个人,说比第 1 个人 大两岁。最后问第 1 个人,他说是 10 岁。请问第 5 个人多 大?
3
第九讲——函数、递推、递归
解题思路:
假设用 S(i) 表示第 i 天没吃之前的桃子数目;

S(1) 即为第 1 天所摘的桃子数; S(2) = S(1) * 1/2 – 1 第 2 天没吃之前的桃子数
S(3) = S(2) * 1/2 - 1 第 3 天没吃之前的桃子数


S(9) = S(8) * 1/2 - 1 第 9 天没吃之前的桃子数
= age(2) + 2 + 2 + 2 // c = age(2) + 2
= age(1) + 2 + 2 + 2 + 2;// c = 10;
2 2
计算年龄程序
第九讲——函数、递推、递归
2 3
第九讲——函数、递推、递归
递归算例(2)
用递归方法计算 n! 算法思路:

C语言递归函数

C语言递归函数

C语言递归函数C语言是一种非常重要的编程语言,递归函数是C语言中的一个重要概念。

本文将详细介绍C语言递归函数的定义、实现以及递归函数的优缺点。

1. 递归函数的定义在C语言中,递归函数是指在函数内部调用自身的函数。

递归函数通常包含一个或多个基准情况(递归终止条件),在满足基准情况之前,递归函数会不断调用自身来解决更小规模的问题。

2. 递归函数的实现为了实现递归函数,我们需要考虑两个重要的要素:基准情况和递归关系。

2.1 基准情况在编写递归函数时,必须确定递归终止条件。

这个条件通常是问题规模足够小,可以直接得出答案的情况。

通过设置基准情况,可以避免递归函数陷入无限循环,导致程序崩溃。

2.2 递归关系递归关系指的是将原始问题拆分为更小规模的子问题,并且这些子问题与原问题的解具有相同的结构。

递归函数通过调用自身来解决子问题,将子问题的解合并为原问题的解。

递归关系的正确定义是确保递归函数能够有效地解决问题的关键。

3. 递归函数的示例下面是一个计算斐波那契数列的递归函数的示例:```c#include <stdio.h>int fibonacci(int n){if(n <= 1) // 基准情况return n;else // 递归关系return fibonacci(n-1) + fibonacci(n-2);}int main(){int n = 10;int result = fibonacci(n);printf("斐波那契数列的第%d项为%d\n", n, result); return 0;}```在以上示例中,递归函数fibonacci计算了斐波那契数列的第n项。

当n小于等于1时,即为基准情况,直接返回n。

否则,递归调用fibonacci函数计算第n-1和第n-2项,并将结果相加返回。

4. 递归函数的优缺点递归函数具有以下优点:- 可以简化代码实现,使代码更加简洁易读。

HDU2046骨牌铺方格递推C语言

HDU2046骨牌铺方格递推C语言

HDU2046⾻牌铺⽅格递推C语⾔
题⽬:
知道应该⽤递归递推来做,但是⼀直找不到规律……拖了好久,终于决定今天做完。

苦思⽆果搜题解,发现代码只有⼏⾏…… 递推递归果然神奇啊
思路:f(1)=1,f(2)=2,f(3)=5,当有n个⽅格的时候,有两种铺法:
1)先铺好n-1个格,有f(n-1)个⽅法,再铺第n层的时候只有⼀种⽅法,所以总⽅法是1*f(n-1);
2)先铺好n-2格,有f(n-2)个⽅法,再铺后⾯两层的时候只能两个都横着铺(否则与第⼀种情况重复),所以也只有⼀种情况,总⽅法数是1*f(n-2)
再没有其他情况了。

推出f(n)=f(n-1)+f(n-2)
提交情况: 2次TLE,两次WA
AC code:
View Code
1#include <stdio.h>
2#include <stdlib.h>
3int main () {
4int n;
5int i;
6 __int64 a[60] = {0, 1, 2};
7for (i = 3; i <= 51; i++)
8 a[i] = a[i - 1] + a[i - 2];
9while (~scanf ("%d", &n))
10 printf ("%I64d\n", a[n]);
11//system ("pause");
12return0;
13}
先开始写了⼀个⼦函数递归,于是超时了,改⽤数组写,a[n]开成了int型,溢出了,于是WA了……
这种找规律的题还是要多多练习才⾏啊!。

递归和递推(end)

递归和递推(end)
方法一:穷举 方法二:二分查找
分析
二分查找的基本思想:首先将结点按排序,其次将查 找值与中间位置的值比较,相等,查找成功;不等,则中 间数据大于或小于查找值,无论怎样查找将在一半的 数据中查找。
例如在有序数列15 数x=19
20 26 31
40中查找
第一次:left=1 right=5 mid=3 x<a[mid]
var m:longint;
writeln(m); end;
利用实参实现!
函数与过程区别
1.声明方式不同 2.返回值的方式不同,函数必须 要对函数名进行赋值,过程则 不必。
讨论:函数与过程的选择?
例3
function fac(x:integer):longint; begin if x=1 then fac:=1 else fac:=fac(x-1)*x; end; 问:此函数合法吗? 实现什么功能?如何实现?
递归的概念
• 递归就是函数或过程自己直接或间 接调用自己! • 两个条件: 1.递归式(递归关系); 2.边界条件。 递归表达式才是解题的关键!
function fac(x:integer):longint; begin if x=1 then fac:=1 else fac:=fac(x-1)*x; end;
迭代
反向迭代
S:=__④____;
N:=0;
Repeat
N:=n+1;s:=n;
For i:=____①___do
For i:=___⑤___ do
S:=___⑥______; Writeln(s);
s:=__②___;
Until s=__③____; Writeln(n);
(2)猴子吃桃。有一群猴子摘来了一批桃子,猴王 规定每天只准吃一半加一只(即第二天吃剩下的一半 加一只,以此类推),第九天正好吃完,问猴子们摘 来了多少桃子?

c语言使用递归函数

c语言使用递归函数

递归函数是一种特殊的函数,它调用自身来解决问题。

在C语言中,递归函数可以通过以下方式实现:
1. 定义一个函数,该函数返回一个值,或者没有返回值(void)。

2. 在函数的函数体中,使用return语句或break语句来结束函数的执行。

3. 在函数的函数体中,调用自身,将问题的规模减小,直到问题能够直接解决为止。

下面是一个简单的递归函数示例,该函数计算一个数的阶乘:
```c
#include <stdio.h>
int factorial(int n) {
if (n == 0) {
return 1;
} else {
return n * factorial(n - 1);
}
}
int main() {
int n = 5;
int result = factorial(n);
printf("%d! = %d\n", n, result);
return 0;
}
```
在上面的代码中,factorial()函数是一个递归函数。

当n等于0时,函数返回1。

否则,函数返回n乘以factorial(n-1)的结果。

在main()函数中,我们调用factorial()函数来计算5的阶乘,并将结果打印到控制台上。

C语言与程序设计ppt-第12章递归

C语言与程序设计ppt-第12章递归

第12章 递 归
华中科技大学计算机学院 卢萍
华中科技大学计算机学院C语言课
2021/4/25
程组
1
本章讲授内容
递归(recursion)是一项非常重要的编 程技巧,可以使程序变得简洁和清晰,是 许多复杂算法的基础。本章介绍 递归、递归函数的概念; 递归的执行过程; 典型问题的递归函数设计; 分治法与快速排序; 回溯法; 递归在动态规划等算法中的应用。
12
【例12.3】 设计一个求解汉诺塔问题的算法。
这是一个典型的用递归方法求解的问题。要移动n个 盘子,可先考虑如何移动n 1个盘子。分解为以下3 个步骤:
(1)把A上的n-1个盘子借助C移到B。 (2)把A上剩下的盘子(即最大的那个)移到C。 (3)把B上的n-1个盘子借助A移到C。 其中,第(1)步和第(3)步又可用同样的3步继
2021/4/25
华中科技大学计算机学院C语言课程组
2
12.1 递归概述
递归是一种函数在其定义中直接或间接调用 自己的编程技巧。递归策略只需少量代码就 可描述出解题过程所需要的多次重复计算, 十分简单且易于理解。
递归调用:函数直接调用自己或通过另一函 数间接调用自己的函数调用方式
递归函数:在函数定义中含有递归调用的函 数
续分解,依次分解下去,盘子数目n每次减少1,直 至n为1结束。这显然是一个递归过程,递归结束条 件是n为1。
2021/4/25
华中科技大学计算机学院C语言课程组
13
函数move(n,a,b,c)
为了更清楚地描述算法,可以定义一个函数 move(n,a,b,c)。该函数的功能是:将n个盘 子从木桩a上借助木桩b移动到木桩c上。算法 的第(1)步和第(3)步的实现都是递归调 用,分别为move(n-1,a,c,b)和move(n1,b,a,c)。

C语言递归

C语言递归

C语言递归递归是一种常见的编程技术,也是C语言中的一种重要的编程方法。

递归是指函数通过自身调用来解决问题的一种方式。

在递归中,函数会重复调用自己,并且每次调用都会解决问题的一部分,直到最终问题被解决。

递归算法递归算法的核心思想是将问题分解成若干个与原问题相似的子问题,并递归地解决这些子问题。

通过最终得出每个子问题的解,再逐步合并,最终得出原问题的解。

递归算法的基本流程如下:递归的优劣递归算法具有可读性好、思路清晰、代码简洁等优点,但是在实现过程中,递归的性能有时会受到限制。

递归算法在运行时会不断地创建新的栈帧,这会占用大量的内存空间,如果递归深度过高,会导致栈溢出的问题。

递归函数中的 STACK OVERFLOW问题:在将递归算法实现时,必须注意递归的深度,否则就会出现STACK OVERFLOW问题。

递归的应用递归算法在很多算法中都有广泛的应用,例如——1.排序算法快速排序、归并排序、堆排序等排序算法中都有递归的应用。

2.搜索算法深度优先搜索和广度优先搜索等搜索算法中都有递归的应用。

3.数学计算递归算法经常用于解决复杂的数学计算问题。

实例以下是一个简单的递归函数例子,函数将返回从1到输入参数 n 的和。

以上代码中,函数 sum 通过递归的方式计算从1到 n 的和。

当 n 的值等于1时,函数返回1,否则函数返回n加上sum(n-1)的值。

```csum:55```输出结果为55,证明递归函数成功地计算出了从1到10之间的所有数字的和。

总结递归是一种非常有用的编程技术,可以帮助我们在编写程序时处理一些复杂的问题。

递归算法的核心思想是将问题分解成若干个与原问题相似的子问题,并通过递归的方式解决它们。

在递归过程中,我们必须注意避免栈溢出等问题,以确保程序能够正常运行。

C语言-递推递归

C语言-递推递归

2012-3-20
12
伯努利装错信封问题
某人给不同地址不同姓名的n位朋友写信,信 某人给不同地址不同姓名的n位朋友写信, 信封都分别写好了。请问:所有信笺、 笺、信封都分别写好了。请问:所有信笺、 信封全都装错的情况有多少种? 信封全都装错的情况有多少种? 信封:A B 信封: 信笺: 信笺:a b C c D d E e F f … …
信封:A B C D E F … 信封: 信笺: 后 封也都装错 封也都装错) 信笺:b a (后n-2封也都装错
错误2: 错误 :
信封: 信封:A B C D E F … 信笺: 封也都装错) 信笺:b 非a (后n-2封也都装错 后 封也都装错
2012-3-20
装错情况 种数Sn-1
14
Sn= (n-1)(Sn-1+ Sn-2)
A B C
2012-3-2024 Nhomakorabea递归
• 当有n个盘子需要移动时,通常的方法如下: (1)把A柱上n-1个盘子借助C柱移动到B柱上。只有 这样,C柱才能为空,则A柱上的第n个盘子(最大 的那个)才能直接移动到C柱上。 (2)将A柱上的剩下的第n个盘子移动到C柱上。这个 盘子已最后到位,不需要再移动了。 (3)再将B柱上的n-1个盘子借助A柱移动到C柱。
2012-3-20 19
递归
f (1) = 1 n =1 f ( n) = f ( 2) = 1 n=2 f (n) = f (n − 2) + f (n − 1) n ≥ 3
int func(int n) /*求斐波那契数列的第n个数*/ { int result; if(n==1) result=1; else if(n==2) result=1; else result=func(n-1)+func(n-2); /*递归*/ return result; } 2012-3-20
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
走上第1级台阶,只有“一步1级”1种 走上第 级台阶,只有“一步 级 种 级台阶 走法, 走法,u1=1; ;
1 2 3
走上第2级台阶,从平地起步, 2步和 步和“ 走上第2级台阶,从平地起步,有“一步1级”走2步和“一步 级台阶 一步1级 2级”走1步这两种走法,u2=2; 步这两种走法, 级 步这两种走法 ; 走上第3级台阶,或者从台阶 一步 一步1级 步上来, 走上第 级台阶,或者从台阶2“一步 级”走1步上来,或者从 级台阶 步上来 台阶1“一步 级”走1步上来,u3=u2+u1=2+1=3; 台阶 一步2级 步上来, ; 一步 步上来 走上第n级台阶,只能从第 级 一步1级 步上来, 走上第 级台阶,只能从第n-1级“一步 级”走1步上来,或者 级台阶 步上来 从第n-2级台阶 一步2级 级台阶“ 步上来, 从第 级台阶“一步 级”走1步上来,un=un-1+un-2 (n>2); 步上来 ;
2012-3-20
11
骨牌铺放
2(n-1) 2(n-2)
1、如果用一个骨牌直接覆盖最左边一列,则剩下的2(n-1)个方格有 、如果用一个骨牌直接覆盖最左边一列,则剩下的 个方格有f(n-1) 个方格有 种铺法; 种铺法; 2、如果用两个骨牌横向覆盖,则剩下的2(n-2)个方格有 、如果用两个骨牌横向覆盖,则剩下的 个方格有f(n-2)种铺法; 种铺法; 个方格有 种铺法 3、第1列没有其他铺法,因此,f(n)=f(n-1)+f(n-2); 、 列没有其他铺法, 列没有其他铺法 因此, ;
第n个月 1 2 3 4 5 6 7 …
2012-3-20 6
大兔对数 0 0 1 1 2 3 5
中兔对数 0 1 0 1 1 2 3
小兔对数 1 0 1 1 2 3 5
总对数
1 1 2 3 5 8 13
Fibnacci 数列
1 f n= 1 f +f n−2 n −1 n =1 n=2 n≥3
A B C
2012-3-20
24
递归
• 当有n个盘子需要移动时,通常的方法如下: (1)把A柱上n-1个盘子借助C柱移动到B柱上。只有 这样,C柱才能为空,则A柱上的第n个盘子(最大 的那个)才能直接移动到C柱上。 (2)将A柱上的剩下的第n个盘子移动到C柱上。这个 盘子已最后到位,不需要再移动了。 (3)再将B柱上的n-1个盘子借助A柱移动到C柱。
/*借助 ,把n-1个盘子从 移动到 借助C, 个盘子从A移动到 借助 个盘子从 移动到B*/ /*把第 个盘子从 移动到 把第n个盘子从 移动到C*/ 把第 个盘子从A移动到
/*借助 ,再把 个盘子从 移动到 借助A,再把n-1个盘子从 移动到C*/ 个盘子从B移动到 借助
scanf("%d",&n); /*盘子个数 盘子个数*/ 盘子个数 hanoi(n,'A','B','C');
//找不到为-1,找到则为0~n-1的数值
特点:用所给关 特点: 键字与线性表中 各元素的关键字 逐个比较, 逐个比较,直到 成功或失败为止。 成功或失败为止。 特点:从前到后, 特点:从前到后, 或从后到前。 或从后到前。
A
B
C
21
递归
• (1)假如只有一个盘子的话,可以直接将 盘子从A柱移动到C柱,即A C。
A
B
C
2012-3-20
22
递归
• • • • (2)假如有两个盘子,则: A B A C B C
A
B
C
2012-3-20
23
递归
• (3)假如有三个盘子,则情况开始复杂,移动 顺序为: • A C • A B • C B • A C • B A • B C • A C
显然可以得到如下公式: 显然可以得到如下公式:
化简后的公式: F(n)=10+(n-1)*2
2012-3-20 5
斐波那契级数-递推的经典问题
• 一对新生小兔,一个月后长成中兔,从第三个月开始长成大 一对新生小兔,一个月后长成中兔, 兔并每个月生一对小兔。按此规律,一年后共有多少对兔子。 兔并每个月生一对小兔。按此规律,一年后共有多少对兔子
班长
fact(2) =2*fact(1)
设计递归程序的重点 是给下级安排工作
班委
fact(1) =1*fact(0)
同学
fact(0) =1
2012-3-20 18
递归
int SearchBin(int *r,int k,int low,int high) //递归 递归 { if(row>high) return 0; //failed mid=(low+high)/2; if(k==r[mid]) return mid; //success else if(k>r[mid]) return SearchBin(*r,k,mid+1,high); else return SearchBin(*r,k,low,mid-1); } }
n=0 1 n!= n(n − 1)! n ≥ 1
printf("%d!=%d\n",5,fact(5));
2012-3-20
17
递归
院长
fact(5) =5*fact(4)
主任
n=0 1 n!= n(n − 1)! n ≥ 1
教师
fact(4) =4*fact(3)
fact(3) =3*fact(2)
2012-3-20
A
B
C
25
递归
void hanoi(int n,char A,char B,char C)
移动到C*/ 移动到 /*借助 ,把n个盘子从 借助B, 个盘子从A 借助 个盘子从
{ if(n==1) move(A,C); else { hanoi(n-1,A,C,B); move(A,C); hanoi(n-1,B,A,C); } }
2012-3-20 3
递推
• 有5人坐在一起,当问第5个人多少岁,他说 比第4个人大2岁,问第4个人多少岁,他说比 第3个人大2岁,依此下去,问第一个人多少 岁,他说他10岁,最后求第5个人多少岁? • 如果所坐的不是5人而是n人,写出第 n个人的年龄表达式。
10
2012-3-20
…….
x
x+2
4
分析思路: 分析思路:
S1=0, S2=1, 封信, 只1封信,不会装错 2封信, 2封信,互相装错 封信
S3=2(S2+S1)=2, 3封信,a->B,b->C,c->A或a->C,c->B,b->A 封信, >B,b->C,c->A或 >C,c->B,bS4=3(S3+S2)=9
2012-3-20
2012-3-20 19
递归
f (1) = 1 n =1 f ( n) = f ( 2) = 1 n=2 f (n) = f (n − 2) + f (n − 1) n ≥ 3
int func(int n) /*求斐波那契数列的第n个数*/ { int result; if(n==1) result=1; else if(n==2) result=1; else result=func(n-1)+func(n-2); /*递归*/ return result; } 2012-3-20
20
递归
• Hanoi(汉诺塔)问题:三根柱子A、B、C,其中A柱 上有64个大小不等的圆盘,并且大的在下,小的在上。 要求把这64个圆盘从A柱移动到C柱上,每次只能移 动一个圆盘,移动时可以借助B来进行,但在任何时 候,任何柱上的圆盘都必须保持大盘在下,小盘在上。 求移动的过程。
2012-3-20
第二讲
基础算法
计算机科学与技术 陈叶芳
2012-3-20 1
目录
• 递推 • 递归 • 排序与检索
2012-3-20
2
递推
• 指一个序列 1,u2,u3,…,un-1,un,后面的 指一个序列u 每一项都能按公式由前面的一项或连 续的几项推算出来, 续的几项推算出来,或者前面的每一 项都能按公式由后面的一项或连续的 几项推算出来。前者叫“顺推” 几项推算出来。前者叫“顺推”,后 者叫“逆推” 者叫“逆推”。 • 递推关系可用它前面1项表示的叫一阶 递推关系可用它前面 项表示的叫一阶 递推数列,可用它前面2项表示的叫二 递推数列,可用它前面 项表示的叫二 阶递推数列。 阶递推数列。
2012-3-20
A
B
C26
排序与检索
• 查找表:用于查找的数据集合,由同一类型数据元 素构成.
2012-3-20
27
排序与查找
列表:同一类型的数据元素(或记录)构成的集合。 列表 可利用任何数据结构实现。 关键字 :数据元素的某个数据项的值。 查找:根据给定的关键字,在特定列表中确定与与之 查找 相同的数据元素,并返回该数据元素在列表中的位置。
即:1、1、2、3、5、8、13、21、34…
关键: 关键:确定问题的递归特性 关键: 关键:分析出递归公式 关键: 关键:分析出初始条件
2012-3-20 7
例-巧妙推算走楼梯
• 楼梯有 级台阶,如果一步走1级或 级,试 楼梯有n级台阶,如果一步走 级或 级或2级 级台阶 n 共有多少种不同的走法? 问:共有多少种不同的走法?
2012-3-20 8
例-巧妙推算走楼梯
初始条件: 初始条件:u1=1;u2=2; ; 1、2、3、5、8、13、21、34、55 、 、 、 、 、 、 、 、
1 2 3 n
相关文档
最新文档