C+함수 의 내장 호출 과 재 귀적 호출 학습 튜 토리 얼

6751 단어 C++함수.
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
많은 문 제 는 재 귀 방법 으로 처리 할 수도 있 고 비 재 귀 방법 으로 처리 할 수도 있다.재 귀 를 실현 할 때 시간 과 공간 에서 의 비용 이 비교적 크 지만 사람들의 사고 에 부합 되 고 절 차 는 쉽게 이해 할 수 있다.

좋은 웹페이지 즐겨찾기