機能と再帰

関数:ライブラリ関数とカスタム関数に分けられます。ライブラリ関数と
同様に、カスタム関数には関数名、戻り値のタイプ、関数パラメーターがありますが、違いは、これらはすべて独自に設計されていることです。

関数呼び出し:
値による呼び出し:関数
の形式パラメーターと実際のパラメーターは異なるメモリブロックを占有し、形式パラメーターの変更
実際のパラメーターの呼び出しに影響しません
アドレスによる呼び出しは、関数の外部で作成された変数のメモリアドレスをに渡すことです関数パラメーターを使用して関数を呼び出す方法。パラメーターを
渡すこの方法により、関数は関数外の変数との実際の接続を確立できます。つまり、関数外の変数を関数内で直接操作できます。
#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

void Swap2(int pa、int pb)
{
int tmp = 0;
tmp = pa;
pa = pb;
pb = tmp;
}

int main()
{
int a = 10;
int b = 20;
printf( "a =%db =%d \ n"、a、b);
Swap2(&a、&b);
printf( "a =%db =%d"、a、b);
0を返します。

}

// int main()
// {
// int a = 10;
// int pa =&a;
//
pa = 20;
// printf( "%d \ n"、a);
// 0を返します;
//}

// void Swap(int x、int y)
// {
// int tmp = 0;
// tmp = x;
// x = y;
// y = tmp;
//)
//
// int main()
// {
// int a = 10;
// int b = 20;
// / int tmp = 0; /
// printf( "a =%db =%d \ n"、a、b);
//スワップ(a、b);
// / tmp = a;
// a = b;
// b = tmp;
/
// printf( "a =%db =%d \ n"、a、b);
// return 0;
//}
演習:
1。数値が素数であるかどうかを判別する関数を記述します。
2.年が飛躍年であるかどうかを判断する関数を記述します。
3.整数および順序付き配列のバイナリ検索を実現する関数を記述します
。4。関数を記述します。この関数が呼び出されるたびに、numの値は1ずつ増加します。

関数の再帰:
それ自体を呼び出すプログラムのプログラミングスキルは再帰と呼ばれます。アルゴリズムとして、再帰はプログラミング言語で広く使用されています。プロセスまたは関数には、その定義または説明で直接または間接的に自身を呼び出す方法があります。通常は大きくて複雑な問題を元の問題と同様の小さな問題に変換します。再帰的戦略では、問題を解決するプロセスで必要な複数の反復計算を記述するために必要なプログラムの数が少ないため、コードが大幅に削減されます。総額。再帰についての主な考え方は、大きなものを小さな
再帰に変えるために必要な2つの条件に
あります。1。制限があります。この条件が満たされると、再帰は続行されません。
2.各再帰呼び出しの後、この制限にますます近づきます。
//関数の再帰
// int main()
// {
// printf( "hehe \ n");
// main(); //スタックオーバーフロー
// return 0;
//}

void print(int n)// 1234
{
if(n> 9)//再帰的条件1
{
print(n / 10); //再帰的条件2
}
printf( "%d"、n%10);
}

int main()
{
unsigned int num = 0;
scanf( "%d"、&num); // 1234
print(num);
0を返します。
}

関数を
記述して一時変数を作成することは許可されていません。文字列の長さを見つけてください#define_CRT_SECLRE_NO_WARNINGS 1

#include <stdio.h>

//一時変数を作成し、文字列の長さを見つけます
// int my_strlen(char str)
// {
// int count = 0;
// while(
str!= '\ 0')
// {
// count ++;
// str ++;
//}
//カウントを返す;
//}

//作成関数は一時変数を作成できません。文字列の長さを見つけるには、再帰メソッド
int my_strlen(char str)
{
if(
str!= '\ 0')
return 1 + my_strlen(str + 1);
else
return 0;
//大きなものは小さなものに変わります
// my_strlen( "bit");
// 1 + my_strlen( "it");
// 1 + 1 + my_strlen( "t");
// 1 + 1 + 1 + my_strlen( " \ 0 ");
// 1 + 1 + 1 + 0;
// 3
}

int main()
{
char arr [] = "bit";
// int len = strlen(arr); //文字列の長さを見つける
// printf( "%d \ n"、len);
// strlenをシミュレートするFunction
int len = my_strlen(arr); // arrは配列であり、配列はパラメーターとして渡されます。渡されるのは配列全体ではなく、要素のアドレス
printf( "len =%d \ n"、len);

return 0;

}

再帰と反復
再帰:関数呼び出し自体が再帰です。
反復:1つのことを繰り返し計算し、1つのことを繰り返し実行し
ます。nの
因数分解を見つけます#define _CRT_SECLRE_NO_WARNINGS 1

#include <stdio.h>

////ループ
// int Fac1(int n)
// {
// int i = 0;
// int ret = 1;
// for(i = 1、i <= n、i ++)
// {
// ret * = i;
//}
// return ret;
//}
//
// int main()
// {
// //
nの因数分解を見つける// int n = 0;
// int ret = 0;
/ / scanf( "%d"、&n);
// ret = Fac1(n); //ループの方法
// printf( "%d \ n"、ret);
//
// 0を返す;
//}

//递归
intFac2(int n)
{
if(n <= 1)
return 1;
それ以外の
場合はn * Fac2(n-1);を返します。
}

int main()
{
//
nの因数分解を見つけるintn = 0;
int ret = 0;
scanf( "%d"、&n);
ret = Fac2(n); //ループの方法
printf( "%d \ n "、ret);

return 0;

}

n番目のフィボナッチ番号を見つける(オーバーフローを考慮せずに)
1 1 2 3 5 8 13 21 34
#define _CRT_SECLRE_NO_WARNINGS 1

#include <stdio.h>

//迭代intFib
(int n)
{
int a = 1;
int b = 1;
int c = 0;
while(n> 2)
{
c = a + b;
a = b;
b = c;
n--;
}
return c;
}

int main()
{
int n = 0;
int ret = 0;
scanf( "%d"、&n);
ret = Fib(n);
printf( "ret =%d \ n"、ret);
0を返します。
}

////再帰
// int count = 0;
// int Fib(int n)
// {
// if(n == 3)// 3番目のフィボナッチ数の計算数をテストする
// {
/ / count ++;
//}
// int ret = 0;
// if(n <= 2)
// return 1;
// else
//
// return Fib(n-1)+ Fib(n-2);
/ /
//}
//
// int main()
// {
// int n = 0;
// int ret = 0;
// scanf( "%d"、&n);
// ret = Fib(n);
// printf( "ret =%d \ n"、ret);
// printf( "count =%d \ n"、count);
// 0を返す;
//}

機能再帰のいくつかの古典的な問題(独立した研究):
1。ハノイの塔の問題
2.
「ソードフィンガーオファー」のプラットフォーム67の書かれたテスト質問からカエルがジャンプする問題

おすすめ

転載: blog.51cto.com/15049077/2571517