算法刷题记录
之第1011题
题目描述:
我们要求找出具有下列性质数的个数(包含输入的自然数n):
先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理:
1. 不作任何处理;
2. 在它的左边加上一个自然数,但该自然数不能超过原数的一半;
3. 加上数后,继续按此规则进行处理,直到不能再加自然数为止.
题解:
#include<iostream>
using namespce std;
int porblem_1011_recursion(int a){
int half=a/2;
int t=0;
if(a==1){
return 1;
}
else{
for(int x=1;x<=half;x++){
t+=porblem_1011_recursion(x);
}
return t+1;
}
}
int main(){
int a=0;
cin>>a;
cout<<problem_1011_recursion(a)<<endl;
return 0;
}
解题思路
很明显是一个递归的问题,然而对于我这个渣来说,,递归什么的一直理解不到位,今天借这个问题
好好学习一下。
首先这个问题可以很明显的看出是可以分解成子问题的,
可以得到数学的递推公式:
f(n)=f(1)+f(2)+f(3)+...+f(n/2);
f(n)表示是n的下层所有可能的组合结果。
可以发现所有问题都归结到1这三个参数上,但是当n=1时其返回结果是1;并且题目要求是包含了其本身也算一种,故在返回时:
f(n)= **1** +f(1)+f(2)+f(3)+...+f(n/2);
故递推关系整理出来后整个问题就迎刃而解啦~~~