IT 프로그래밍/C++

[C++] 피보나치 수열 초보자용 만들기

기술1 2024. 3. 8. 23:37
반응형
#include <iostream>

using namespace std;

int fibonacci(int n);

int main()
{
	int a;
	cin >> a;

	cout << fibonacci(a);

	return 0;
}

int fibonacci(int n)
{
	if (n <= 1)
	{
		return 1;
	}
	else
	{
		return fibonacci(n - 1) + fibonacci(n - 2);
	}
	return 0;
}

재귀함수를 이용해 만든 피보나치 수열입니다. 

이렇게 return 방식을 이용해서 피보나치 수열이 나오도록 했습니다. 

 

여기서 막혔던 점은 제가 return이라는 것에 대한 정의를 잘 몰랐던 것 같습니다. 이후 자세히 안 후 보완해서 포스팅을 적을 것입니다. 

2번문제


cout << 1 - 1 / pow(2, n);

고민하다가 낸 해결책, 이런식으로 제곱을 구하기 됐습니다. 이제 그 합을 연달아 구해야 하니 입력값이 정해져있는 것이니 for문을 활용하면 될 것 같습니다. 

#include <iostream>


using namespace std;

int main()
{
	int n = 0;
	double sum = 1;

	cin >> n;

	for (int i = 1; i <= n; i++)
	{

		sum += (pow(-1, i)) * (1 / pow(2, i));
	}
	cout << "The sum is " << sum << endl;

	return 0;
}

정답인지는 모르겠습니다만 이렇게 해주었습니다. sum에 1이 먼저 들어가야 하기 때문에 1을 넣어준 것이 특징이며(맞는 정답일까요?) 그리고 for문을 활용해서 계속해서 반복되는 양의 정수 n을 만들어줬습니다. 

 

막힌 부분은 sum +=을 활용하는 부분이었는데 pow(-1, i)를 넣어야하는 곳에 n을 넣는 사소한 실수를 해주어서 5분정도 고민을 했습니다. 디버거를 하면서 찾으니 어떤 부분이 오류가 있는지 찾기 편했습니다. 

 

 

이 문제를 보고서 처음에는 제곱근을 통해 pow()로 정의하려고 했으나 팩토리얼의 정의를 기억해내고 먼저 n!을 for문으로 한 다음에 계속해서 더하는 과정도 for문을 써서 for문 안에 for문을 사용해야 겠다는 생각을 했습니다.

 

일단 n의 갯수가 입력받은 숫자로 정해져 있으니 while문이 아닌 for문을 사용해야 겠다는 추론을 했습니다. 

		for (int i = 1; i <= n; i++)
		{
			sum *= i;
		}

먼저 고민 끝에 끄집어 낸 것은 바로 n!을 구해주는 for문이었습니다. 이런 식으로 하면 for문을 구할 수 있었고 sum은 1로 초기화를 해주었습니다. 

 

#include <iostream>

using namespace std;

int square(int n);


int main()
{
	int n = 0;
	double sum1 = 0;
	cin >> n;

	for (int i = 1; i <= n; i++)
	{

		sum1 += (double)1 / square(i);
	}
	cout << sum1 << endl;;
	return 0;
}

int square(int n)
{
	double sum = 1;

	for (int i = 1; i <= n; i++)
	{
		sum *= i;
	};

	return sum;
}

이번에 조금 오래 걸린 것 같습니다. 계속해서 오류가 났고 방법을 모르겠던 도 sum1 = 0으로 바꿔주고 가장 헷갈렸던 부분은 바로 1 / square(i)를 해줄 때 계속해서 실수가 아닌 정수로 나온다는 것이었습니다. 그런데 전에 강의에서 배웠던 나누기를 할 때 주의해야 할 점인 바로 연산자를 선언해주면서 정수가 되지 않도록 해주는 것입니다.

 

물론 제가 아직 기초를 배우다 보니 저 연산자가 틀렸을 것 같습니다. 지금 챗gpt가 먹통인 관계로 챗gpt가 된다면 바로 물어본 후 수정하도록 하겠습니다. 

 

 

반응형