/*
rec(n) : 1+2+3+ ... +n
: 1+2+3+ ...+n-1 +n
: rec(n-1) + n
종료조건 if(n==1) return 1;
#include<stdio.h>
int rec(int n)
{
if(n==1) return 1;
return n+rec(n-1);
}
첫 번째 수와 두 번째 수는 모두 1이고
세 번째 수부터는 이전의 두 수를 더하여 나타낸다.
rec(n) : n 번째 피보나치수
: rec(n-2)+rec(n-1)
#include<stdio.h>
int rec(int n)
{
if(n==1||n==2) return 1; //종료조건
return rec(n-2)+rec(n-1) ; //재귀호출
}
int main()
{
int n;
scanf("%d",&n);
printf("%d",rec(n));
return 0;
}
//n/2 n%2
//7/2=3 3/2=1 1/2=0
//7%2=1 3%2=1 1%2=1
rec(n) : n의 2진수 표현
: rec(n/2) --> n%2 출력
#include<stdio.h>
void rec(int n)
{
if(n==0) return ;//rec(n)=n/2 +1 번 나누기
rec(n/2);
printf("%d",n%2);
}
int main()
{
int n;
scanf("%d",&n);
if(n==0)
{
printf("0"); return 0;
}
else
{
rec(n);
}
}
//5=1+1+1+1+1
5=2+1+1+1
5=2+2+1
5=3+1+1
5=3+2
rec(1)=1
rec(2)=2
rec(3)=4
rec(4)=7
rec(5)=13
rec(6)=24
rec(n)=rec(n-1)+rec(n-2)+rec(n-3)
#include<stdio.h>
int memo[100001]={}; //계산의 중복을 줄이기 위해 저장해놓고 사용 //
//memo[k] = k계단을 오를 수 있는 가짓수
int rec(int n)
{
if(memo[n]!=0) return memo[n];//
if(n==1) return memo[1]=1;
else if(n==2) return memo[2]=2;
else if(n==3) return memo[3]=4;
return memo[n]=(rec(n-1)+rec(n-2)+rec(n-3))%1000;//
}
int main()
{
int n;
scanf("%d",&n);
printf("%d",rec(n));
return 0;
}
#include<stdio.h>
int memo[201]={};
int rec(int n)
{
if(memo[n]!=0) return memo[n];
if(n==1) return memo[1]=1;
else if(n==2) return memo[2]=1;
return memo[n]=(rec(n-1)+rec(n-2))%10009;
}
int main()
{
int n;
scanf("%d",&n);
printf("%d",rec(n));
return 0;
}
*/