题目:https://cn.vjudge.net/problem/UVA-699
对于这个题目,要分析学习的还是所应用的递归。
在写递归具体步骤的时候,可以把目光集中到递归当中的一 项上,比如递归刚开始怎么走,递归最后一步要结束了该怎么走。
想递归,要着眼于大局,写递归,要工笔细描,着眼单步;
这道题目是应用于树的先序方式输入的递归方式,在init()只作为最初的判断和根节点的左右树的递归入口;build()函数则是整个递归函数体,边读入边统计。
#include <bits/stdc++.h>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <iostream>
//#define LOCAL
using namespace std;
const int maxn=1e5+10;
int sum[maxn];
void build(int p)
{
int v;cin>>v;
if(v==-1) return;
sum[p]+=v;
build(p-1);
build(p+1);
}
bool init()
{
int v;cin>>v;
if(v==-1) return false;
memset(sum,0,sizeof sum);
int pos=maxn/2;
sum[pos]+=v;
build(pos-1);
build(pos+1);
return true;
}
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
#endif
int case1=1;
while(init())
{
int p=0;
while(sum[p]==0)p++;
cout<<"Case "<<case1++<<":\n"<<sum[p];
p++;
while(sum[p]!=0) cout<<" "<<sum[p++];
cout<<endl<<endl;
}
return 0;
}