C++函数、递推、递归
- 格式:ppt
- 大小:2.26 MB
- 文档页数:77


二分法查找:
#include "iostream.h"
int s[10],key;
int search(int low,int high)
{
if(low>high)
return -1;
int mid=(low+high)/2;
if(key==s[mid])
return s[mid];
else if(key>s[mid])
{
return search(mid+1,high);
}
else if(key
{
return search(low,mid-1);
}
}
void main()
{
int i;
cout<<"输入数组"< for(i=0;i<10;i++) { cin>>s[i]; } cout<<"输入查找的数字"< cin>>key; cout< }
算法总结之递推与递归
递推算法
递归算法⼤致包括两⽅⾯的内容:1)递归起点 ; 2)递归关系
递推起点
递归起点⼀般由题⽬或者实际情况确定,不由递归关系推出。如果⽆法确定递归起点,那么递归算法就⽆法实现。可见,递归起点是递归算
法中的重要⼀笔。
递推关系递归关系是递归算法的核⼼。常见的递归关系有以下⼏项:
1)⼀阶递推;
2)多阶递推;
3)间接递推;
4)逆向递推;
5)多维递推。
下⾯通过栗⼦来详细介绍⼀下上述类别的递推关系。
1. ⼀阶递推
在计算f(i)时,只⽤到前⾯项中的⼀项,如等差数列。公差为3的等差数列,其递推关系为:
f(i)=f(i-1)+3
eg. 平⾯上10条直线最多能把平⾯分成⼏部分?
分析:以直线数⽬为递推变量,假定i条直线把平⾯最多分成f(i)部分,则f(i-1)表⽰i-1条直线把平⾯分成的最多部分。在i-1条直线的平⾯上增
加直线i,易得i与平⾯上已经存在了的i-1条直线最多各有⼀个交点,即直线i最多被分成i段,⽽这i段将会依次将平⾯⼀分为⼆,即直线i将最
多使平⾯多增加i部分。所以,递推关系可表⽰为:f(i)=f(i-1)+i
易得当0条直线时,平⾯为1部分。所以f(0)=1为递推起点。
上述分析可⽤下⾯代码表⽰(c++):
#define MAX 100
int f[MAX] //存放f(i)
int lines(int n){
//输⼊n为直线数⽬
//输出最多部分数
int i;
f(0)=1;
for(i=1;i<=n;i++){
f[i]=f[i-1]+3;
}
return f[i];
}
2. 多阶递推
在计算f(i)时,要⽤到前⾯计算过的多项,如Fibonacci数列。
eg.求Fibonacci的第10项。
分析:总所周知,Fibonacci数列中的第n项等于第n-1项加上n-2项。所以递推关系为
f(i)=f(i-1)+f(i-2);且f[0]=f[1]=1。
C++代码如下:
#define MAX 100
问题描述
大家都知道"超级玛丽"是一个很善于跳跃的探险家,他的拿手好戏是跳跃,但它一次只能向前跳一步或两步。有一次,他要经过一条长为n的羊肠小道,小道中有m个陷阱,这些陷阱都位于整数位置,分别是a1,a2,....am,陷入其中则必死无疑。显然,如果有两个挨着的陷阱,则玛丽是无论如何也跳过不去的。
现在给出小道的长度n,陷阱的个数及位置。求出玛丽从位置1开始,有多少种跳跃方法能到达胜利的彼岸(到达位置n)。
输入格式
第一行为两个整数n,m
第二行为m个整数,表示陷阱的位置
输出格式
一个整数。表示玛丽跳到n的方案数
样例输入
4 1
2
样例输出
1
数据规模和约定
40>=n>=3,m>=1
n>m;
陷阱不会位于1及n上
参考代码见下页
参考代码见下页
参考代码见下页
#include
#include
#include
using namespace std;
int n,m;
int a[50];
int b[50];
int ans=0;
void dfs(int x)
{
if (x>n) return;
if (x==n)
{
ans++;
return;
}
if (!b[x+1]) dfs(x+1);
if (!b[x+2]) dfs(x+2);
}
int main()
{
int i,j,k;
scanf("%d%d",&n,&m);
memset(b,0,sizeof(b));
for (i=0;i
{
scanf("%d",&a[i]);
b[a[i]]=1;
}
sort(a,a+m);
for (i=0;i
{
if (a[i]+1==a[i+1])
{
printf("0");
return 0;
}
}
dfs(1);
printf("%d",ans);
return 0;
正整数分解成几个正整数相加 c语言递归实现
1. 引言
在数学中,将一个正整数分解成几个正整数相加的问题一直备受关注。这个问题不仅在数论中有着重要的意义,也在计算机科学中有着广泛的应用。本文将通过 c 语言递归实现,探讨如何将一个正整数分解成几个正整数相加的具体方法和实现过程。
2. 问题分析
给定一个正整数 n,我们希望将它分解成几个正整数相加,即 n = a1
+ a2 + ... + ak,其中 a1, a2, ..., ak 均为正整数,并且 k 至少为 2。我们的目标是找到所有满足条件的 a1, a2, ..., ak 的组合。这个问题涉及到组合数学和算法设计,我们将通过 c 语言递归实现来解决这个问题。
3. c 语言递归实现
我们需要设计一个递归函数来实现正整数分解的过程。我们定义一个函数 dpose,它接收三个参数:n 表示待分解的正整数,start 表示当前递归的起始数值,path 表示当前已经找到的分解路径。具体的 c 语言实现如下所示:
```c
#include
void dpose(int n, int start, int path[], int idx) {
if (n == 0) {
printf("%d = ", n);
for (int i = 0; i < idx; i++) {
if (i > 0) {
printf(" + ");
}
printf("%d", path[i]);
}
printf("\n");
} else {
for (int i = start; i <= n; i++) {
path[idx] = i;
dpose(n - i, i, path, idx + 1);