过程函数与递归

Posted dahaihaohan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了过程函数与递归相关的知识,希望对你有一定的参考价值。

P1028 数的计算

题目描述

我们要求找出具有下列性质数的个数(包含输入的自然数 nn ):

先输入一个自然数 nn ( n le 1000n1000 ),然后对此自然数按照如下方法进行处理:

  1. 不作任何处理;

  2. 在它的左边加上一个自然数,但该自然数不能超过原数的一半;

  3. 加上数后,继续按此规则进行处理,直到不能再加自然数为止.

输入输出格式

输入格式:

 

11 个自然数 nn ( n le 1000n1000 )

 

输出格式:

 

11 个整数,表示具有该性质数的个数。

 

输入输出样例

输入样例#1: 复制
6
输出样例#1: 复制
6

说明

满足条件的数为

6,16,26,126,36,136

思路:递推;

 1 include<bits/stdc++.h>
 2 using namespace std;
 3 int dp[1005];
 4 int main(){
 5     int n;
 6     scanf("%d",&n);
 7     for(int i=0;i<=n;i++){
 8         dp[i]=1;
 9     }
10     for(int i=1;i<=n;i++){
11         for(int j=1;j<=i/2;j++){
12             dp[i]+=dp[j];
13         }
14     }
15     printf("%d
",dp[n]);
16 } 

P1036 选数

题目描述

已知 nn 个整数 x_1,x_2,…,x_nx1?,x2?,,xn? ,以及 11 个整数 kk ( k<nk<n )。从 nn 个整数中任选 kk 个整数相加,可分别得到一系列的和。例如当 n=4,k=3n=4,k=3 , 44 个整数分别为 3,7,12,193,7,12,19 时,可得全部的组合与它们的和为:

3+7+12=223+7+12=22

3+7+19=293+7+19=29

7+12+19=387+12+19=38

3+12+19=343+12+19=34 。

现在,要求你计算出和为素数共有多少种。

例如上例,只有一种的和为素数: 3+7+19=293+7+19=29 。

输入输出格式

输入格式:

 

键盘输入,格式为:

n,kn,k ( 1 le n le 20,k<n1n20,k<n )

x_1,x_2,…,x_n (1 le x_i le 5000000)x1?,x2?,,xn?(1xi?5000000)

 

输出格式:

 

屏幕输出,格式为: 11 个整数(满足条件的种数)。

 

输入输出样例

输入样例#1: 复制
4 3
3 7 12 19
输出样例#1: 复制
1
思路:搜索;
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int a[25];
 4 int n,k;
 5 int co=0;
 6 void dfs(int t,int ii);
 7 int main(){
 8     scanf("%d%d",&n,&k);
 9     for(int i=0;i<n;i++){
10         scanf("%d",&a[i]);
11     }
12     dfs(0,0);
13     printf("%d
",co);
14 }
15 int sum=0;
16 int pan(int s); 
17 void dfs(int t,int ii){
18     if(t==k){
19         if(pan(sum)){
20             co++;
21         }
22     }
23     else{
24         for(int i=ii;i<n;i++){
25             sum+=a[i];
26             dfs(t+1,i+1);
27             sum-=a[i];
28         }
29     }
30 }
31 int pan(int s){
32     for(int i=2;i<=sqrt(s);i++){
33         if(s%i==0){
34             return 0;
35         }
36     }
37     return 1;
38 }

P1149 火柴棒等式

题目描述

给你n根火柴棍,你可以拼出多少个形如“ A+B=CA+B=C ”的等式?等式中的 AA 、 BB 、 CC 是用火柴棍拼出的整数(若该数非零,则最高位不能是 00 )。用火柴棍拼数字 0-90?9 的拼法如图所示:

技术分享图片

注意:

  1. 加号与等号各自需要两根火柴棍

  2. 如果 A≠BAB ,则 A+B=CA+B=C 与 B+A=CB+A=C 视为不同的等式( A,B,C>=0A,B,C>=0 )

  3. nn 根火柴棍必须全部用上

输入输出格式

输入格式:

 

一个整数 n(n<=24)n(n<=24) 。

 

输出格式:

 

一个整数,能拼成的不同等式的数目。

 

输入输出样例

输入样例#1: 复制
14
输出样例#1: 复制
2
输入样例#2: 复制
18
输出样例#2: 复制
9

说明

【输入输出样例1解释】

22 个等式为 0+1=10+1=1 和 1+0=11+0=1 。

【输入输出样例2解释】

99 个等式为:

0+4=4
0+11=11
1+10=11
2+2=4
2+7=9
4+0=4
7+2=9
10+1=11
11+0=11
思路:枚举;
 1 #include<bits/stdc++.h>
 2 int a[20001]={6};
 3 int c[10]={6,2,5,5,4,5,6,3,7,6};
 4 int n;
 5 int sum=0;
 6 int i,j;
 7 int main(){
 8     scanf("%d",&n);
 9     for(i=1;i<=20000;i++){
10         j=i;
11         while(j>=1){
12             a[i]=a[i]+c[j%10];
13             j=j/10;
14         }
15     }
16     for(i=0;i<=10000;i++)
17         for(j=0;j<=10000;j++)
18             if(a[i+j]+a[j]+a[i]+4==n)
19                 sum++;
20     printf("%d
",sum);
21 }

 



以上是关于过程函数与递归的主要内容,如果未能解决你的问题,请参考以下文章

递归与循环的区别

JavaScript函数之递归

函数递归与二分法

算法分析与设计论文

递归函数与生成式

Java 基础语法方法的使用