void f(int a[][25]){
cout<<a[1][1];
return;
}
int main(){
int i,j,n,m,a[105][25];
cin>>n>>m;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
cin>>a[i][j];
f(a);
return 0;
}
全局变量、局部变量及其作用域
全局变量适用于所有函数(作用域)
局部变量只适用于该函数内部(作用域)
全局变量能够使用的内存更大
函数的综合运用与练习
一本通练习
1397~1413, 有些题目有一定难度
函数的递归调用
函数调用自身被称为是函数的递归调用
求解的问题能够化为子问题求解且求解方法与原问题相同
递归调用的次数是有限的
递归的终止条件
递归式
函数的递归调用实例
求n!
递归的终止条件:if(n==1) return 1;
递归式:f(n)=n*f(n-1);
int f(int n){
if(n==1) return 1;
return n*f(n-1);
}
int main(){
int n;
cin>>n;
cout<<f(n);
return 0;
}
求最大公约数
递归的终止条件:if(n%m==0)return m;
递归式:f(n, m)=f(m, n%m);
int Gcd(int n, int m){
if(n%m==0)return m;
return Gcd(m, n%m);
}
int main(){
int n,m;
cin>>n>>m;
cout<<Gcd(n,m);
return 0;
}
递归调用练习
一本通练习
1158~1167
递归调用练习讲解
进制转换(注意递的过程和归的过程)
#include<iostream>
#include<cstdio>
using namespace std;
void f(int x, int m){
if(x!=0)f(x/m,m);
if(x!=0)
if(x%m>9)cout<<char('A'+x%m-10);
else cout<<x%m;
/*
x m
11 2 1
5 2 1
2 2 0
1 2 1
0
*/
}
int main(){
int x,m;
cin>>x>>m;
f(x,m);
return 0;
}
递归的优化
菲波那切数列
#include<iostream>
#include<cstdio>
using namespace std;
long long s=0,a[205];
long long f(int n){
// if(n==1) return 1;
// return n+f(n-1);
s++;
if(n==0)return 0;
if(n==1)return 1;
if(a[n]) return a[n];
return a[n]=f(n-1)+f(n-2);
}
int main(){
int n;
cin>>n;
cout<<f(n)<<endl;
cout<<s<<endl;
return 0;
}
30
832040
59
30
832040
2692537
函数综合练习
矩阵匹配 04:最匹配的矩阵 给定一个mn的矩阵A和rs的矩阵B,其中0 < r ≤ m, 0 < s ≤ n,A、B所有元素值都是小于100的正整数。 求 A 中一个大小为 r*s 的子矩阵 C,使得 B 和 C 的对应元素差值的绝对值之和最小,这时称 C 为最匹配的矩阵。如 果有多个子矩阵同时满足条件,选择子矩阵左上角元素行号小者,行号相同时,选择列号小者。 输入 第一行是 m 和 n,以一个空格分开。 之后 m 行每行有 n 个整数,表示 A 矩阵中的各行,数与数之间以一个空格分开。 第 m+2 行为 r 和 s,以一个空格分开。 之后 r 行每行有 s 个整数,表示 B 矩阵中的各行,数与数之间以一个空格分开。 (1 ≤ m ≤ 100,1 ≤ n ≤ 100) 输出 输出矩阵 C,一共 r 行,每行 s 个整数,整数之间以一个空格分开。 样例输入 33 34 5 53 4 82 4 22 73 49 样例输出 45 34