C+함수 의 내장 호출 과 재 귀적 호출 학습 튜 토리 얼
C++함 수 를 끼 워 넣 을 수 없습니다.즉,한 함수 에 다른 함 수 를 완전히 포함 할 수 없습니다.한 프로그램 에서 모든 함수 의 정 의 는 서로 평행 하고 독립 적 이다.
C++는 함 수 를 끼 워 넣 을 수 없 지만 함 수 를 끼 워 넣 을 수 있 습 니 다.즉,한 함 수 를 호출 하 는 과정 에서 다른 함 수 를 호출 할 수 있 습 니 다.
프로그램 에서 함수 내장 호출 을 실현 할 때 주의해 야 할 것 은 함 수 를 호출 하기 전에 모든 호출 된 함수 에 대해 설명 을 해 야 한 다 는 것 입 니 다.
[예]현 절 법 으로 방정식 f(x)=x3-5x2+16x-80=0 의 뿌리 를 구한다.
이것 은 수치 로 문 제 를 풀 려 면 먼저 현 절 법 으로 뿌리 를 구 하 는 알고리즘 을 분석 해 야 한다.수학 지식 에 따라 다음 과 같은 문제 풀이 절 차 를 열거 할 수 있다.
1)두 개의 다른 점 x1,x2 를 취하 고 f(x1)와 f(x2)기호 가 반대 되면(x1,x2)구간 에 반드시 하나의 뿌리 가 있어 야 한다.f(x1)와 f(x2)가 같은 기호 라면 f(x1),f(x2)가 다른 번호 가 될 때 까지 x1,x2 를 바 꿔 야 한다.주의 x1?x2 의 값 은 차이 가 너무 크 지 않 아(x1,x2)구간 에 한 개의 뿌리 만 있 음 을 보증 합 니 다.
2)연결(x1,f(x1)과(x2,f(x2)두 점,이 선(즉 현)은 x 축 을 x 축 에 교차 시 켜 그림 을 본다.
x 점 좌 표 는 다음 식 으로 구 할 수 있 습 니 다:
다시 x 에서 f(x)를 구하 다.
3)f(x)와 f(x1)가 같은 기호 라면 뿌리 는(x,x2)구간 에 있어 야 하 며,이때 x 를 새로운 x1 로 한다.f(x)와 f(x2)가 같은 기호 라면 뿌리 가(x1,x)구간 에 있 음 을 나타 내 고 x 를 새로운 x2 로 한다.
4)|f(x)|<까지 반복 절차(2)와(3)ξ까지ξ아주 작은 정수,예 를 들 면 10-6 이다.이때 f(x)개 그 는 0 이 라 고 생각한다.
이것 이 바로 현 절 법의 알고리즘 으로 프로그램 에서 다음 과 같은 몇 가지 함수 로 상기 관련 부분 기능 을 실현 한다.
1)함수 f(x)로 x 를 대표 하 는 함수:x3-5x2+16 x-80.
2)함수 xpoint(x1,x2)로(x1,f(x1)와(x2,f(x2)의 연결선 과 x 축의 교점 x 의 좌 표를 구한다.
3)함수 루트(x1,x2)로(x1,x2)구간 의 그 실 근 을 구한다.분명히 루트 함 수 를 실행 하 는 과정 에서 xpoint 함 수 를 사용 하고 xpoint 함 수 를 실행 하 는 과정 에서 f 함 수 를 사용 해 야 한다.
위 알고리즘 에 따라 아래 프로그램 을 작성 할 수 있 습 니 다:
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
double f(double); //
double xpoint(double, double); //
double root(double, double); //
int main( )
{
double x1,x2,f1,f2,x;
do
{
cout<<"input x1,x2:";
cin>>x1>>x2;
f1=f(x1);
f2=f(x2);
} while(f1*f2>=0);
x=root(x1,x2);
cout<<setiosflags(ios::fixed)<<setprecision(7);
// 7
cout<<"A root of equation is "<<x<<endl;
return 0;
}
double f(double x) // f , f(x)
{
double y;
y=x*x*x-5*x*x+16*x-80;
return y;
}
double xpoint(double x1, double x2) // xpoint , x
{
double y;
y=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1)); // xpoint f
return y;
}
double root(double x1, double x2) // root ,
{
double x,y,y1;
y1=f(x1);
do
{
x=xpoint(x1,x2); // root xpoint
y=f(x); // root f
if (y*y1>0)
{
y1=y;
x1=x;
}
else
x2=x;
}while(fabs(y)>=0.00001);
return x;
}
운행 상황 은 다음 과 같다.
input x1, x2:2.5 6.7L
A root of equation is 5.0000000
프로그램 설명:1)함 수 를 정의 할 때 함수 이름 은 f,xpoint,root 의 3 개 함수 가 서로 독립 되 어 서로 종속 되 지 않 습 니 다.이 세 개의 함 수 는 모두 쌍 정밀도 형 으로 정 해 졌 다.
2)3 개 함수 의 정 의 는 모두 main 함수 뒤에 나타 나 므 로 main 함수 앞에서 이 3 개 함수 에 대해 설명 합 니 다.
습관 적 으로 이 프로그램 에 사용 되 는 모든 함 수 를 맨 앞 에 집중 하여 설명 합 니 다.
3)프로그램 은 main 함수 부터 실 행 됩 니 다.
4)루트 함수 에서 절대 값 을 구 하 는 함수 fabs 를 사용 해 야 합 니 다.이것 은 쌍 정밀도 수 에 대해 절대 값 을 구 하 는 시스템 함수 입 니 다.이것 은 수학 함수 라 이브 러 리 에 속 하기 때문에 파일 의 시작 부분 에\#include
C++함수 재 귀적 호출
한 함 수 를 호출 하 는 과정 에서 이 함수 자 체 를 직접 또는 간접 적 으로 호출 하여 함수 의 재 귀(recursive)호출 이 라 고 합 니 다.C++함수 의 재 귀적 호출 을 허용 합 니 다.예 를 들 면:
int f(int x)
{
int y, z;
z=f(y); // f , f
return (2*z);
}
이상 은 본 함 수 를 직접 호출 하 는 것 입 니 다.아래 의 그림 을 보십시오.아래 그림 은 본 함 수 를 간접 적 으로 호출 하 는 것 을 나타 낸다.f1 함 수 를 호출 하 는 과정 에서 f2 함 수 를 호출 하고 f2 함 수 를 호출 하 는 과정 에서 f1 함 수 를 호출 합 니 다.
그림 에서 볼 수 있 듯 이 이 두 가지 재 귀적 호출 은 모두 끝 이 없 는 자체 호출 이다.분명 한 것 은 프로그램 에서 이러한 종료 되 지 않 은 재 귀적 호출 이 나타 나 서 는 안 되 고 유한 한 횟수 의 재 귀적 호출 만 나타 나 야 한다.이것 은 if 문 구 를 사용 하여 제어 할 수 있 고 특정한 조건 이 성립 될 때 만 재 귀적 호출 을 계속 집행 해 야 한다.그렇지 않 으 면 더 이상 계속 하지 않 는 다.
재 귀 호출 을 포함 하 는 함 수 를 재 귀 함수 라 고 합 니 다.
[예]다섯 명 이 같이 앉 아서 다섯 번 째 사람 몇 살 이 냐 고요?그 는 네 번 째 사람 보다 두 살 많다 고 말 했다.네 번 째 사람 에 게 나 이 를 물 었 더 니 세 번 째 사람 보다 두 살 많다 고 했다.세 번 째 사람 에 게 물 었 더 니 두 번 째 사람 보다 두 살 많다 고 한다.두 번 째 사람 에 게 물 어 보 니 첫 사람 보다 두 살 많다 고 한다.마지막 으로 첫 번 째 사람 에 게 물 었 더 니 10 살 이 라 고 했다.다섯 번 째 사람 은 몇 살 입 니까?
모든 사람의 나 이 는 앞의 한 사람의 나이 보다 두 살 많다.즉:
age(5)=age(4)+2
age(4)=age(3)+2
age(3)=age(2)+2
age(2)=age(1)+2
age(1)=10
다음 과 같이 식 으로 설명 할 수 있 습 니 다.
age(n)=10 (n=1)
age(n)=age(n-1)+2 (n>1)
n>1 시 n 번 째 사람의 나 이 를 구 하 는 공식 이 같다 는 것 을 알 수 있다.따라서 하나의 함수 로 상술 한 관 계 를 나 타 낼 수 있다.그림 4.11 은 다섯 번 째 사람의 나 이 를 구 하 는 과정 을 나타 낸다.다음 C++프로그램 을 쓸 수 있 습 니 다.그 중의 age 함 수 는 상기 재 귀 과정 을 실현 하 는 데 사 용 됩 니 다.
#include <iostream>
using namespace std;
int age(int);//
int main( )//
{
cout<<age(5)<<endl;
return 0;
}
int age(int n)//
{
int c; // c
if(n==1) c=10; // n=1 , 10
else c=age(n-1)+2; // n>1 , 2
return c; //
}
실행 결 과 는 다음 과 같 습 니 다.
18
[예]재 귀 방법 으로 n 을 구하 세 요!제발1 부터 2 를 곱 하고 3 을 곱 하면 n 까지 계속 곱 할 수 있 습 니 다.제발재 귀적 방법,즉 5!=4!×5,그리고 4!=3!×4,…,1!=1。아래 의 귀속 공식 으로 표시 할 수 있다.
n! = 1 (n=0, 1)
n * (n-1)! (n>1)
예 4.10 의 기초 가 있어 서 이 문 제 를 쉽게 쓸 수 있 는 프로그램 이 있 습 니 다.
#include <iostream>
using namespace std;
long fac(int);//
int main( )
{
int n;//n
long y; //y n!
cout<<"please input an integer :"; //
cin>>n; // n
y=fac(n);// fac n!
cout<<n<<"!="<<y<<endl; // n!
return 0;
}
long fac(int n) //
{
long f;
if(n<0)
{
cout<<"n<0,data error!"<<endl; // , -1
f=-1;
}
else if (n==0||n==1) f=1; //0! 1! 1
else f=fac(n-1)*n;//n>1 ,
return f;// f
}
운행 상황 은 다음 과 같다.
please input an integer:10L
10!=3628800
많은 문 제 는 재 귀 방법 으로 처리 할 수도 있 고 비 재 귀 방법 으로 처리 할 수도 있다.재 귀 를 실현 할 때 시간 과 공간 에서 의 비용 이 비교적 크 지만 사람들의 사고 에 부합 되 고 절 차 는 쉽게 이해 할 수 있다.이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Visual Studio에서 파일 폴더 구분 (포함 경로 설정)Visual Studio에서 c, cpp, h, hpp 파일을 폴더로 나누고 싶었습니까? 어쩌면 대부분의 사람들이 있다고 생각합니다. 처음에 파일이 만들어지는 장소는 프로젝트 파일 등과 같은 장소에 있기 때문에 파일...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.