関数の再帰と反復(分析およびグラフィカル)

コンテンツ

再帰とは何ですか?

再帰の3つの要素

1.この関数で何をしたいのかを明確にします

2.再帰の終了条件を見つけます

3.関数の同値関係を見つけます

 符号なし整数値を取り、そのビットを順番に出力します。

n番目のフィボナッチ数を見つけます。(オーバーフローに関係なく)


再帰とは何ですか?

自分自身を呼び出すプログラムのプログラミングトリックは、再帰と呼ばれます。
大きくて複雑な問題を、元の問題と同様の小さな問題に変換して解決します。
再帰についての主な考え方は、大きなものを小さくすることです。

再帰に必要な2つの条件

制約があります。この制約が満たされると、再帰は続行されません。
再帰呼び出しを行うたびに、この制限にどんどん近づいていきます。

再帰の3つの要素

1.この関数で何をしたいのかを明確にします

再帰の場合、非常に重要なことは、この関数の機能とは何か、どのようなことを行うかということだと思います。これは完全にあなたによって定義されます。そのような:

// 求 n 的阶乘(n不为0)
int fun(int n)
{
    
}

2.再帰の終了条件を見つけます

いわゆる再帰とは、関数内で関数自体を呼び出すことであるため、再帰の終了条件を見つける必要があります。そうしないと、無限ループになります。

int fun(int n)
{
    if(n == 1)
    {
        return 1;
    }
}

3.関数の同値関係を見つけます

パラメータの範囲を狭め続ける必要があります。狭めた後、いくつかの補助変数または演算を使用して元の関数の結果を変更せず、大きなものを小さくすることができます。

int fun(int n)
{
    if(n == 1)
    {
        return 1;
    }
    return fun(n-1) * n;
}

 符号なし整数値を取り、そのビットを順番に出力します。

void print(int n)
{
	if (n > 9)
	{
		print(n / 10);
	}
	
	printf("%d ", n % 10);
	
}

int main()
{
	unsigned int num = 0;
	scanf("%d", &num);
	print(num);
	return 0;
}



n番目のフィボナッチ数を見つけます。(オーバーフローに関係なく)

#include <stdio.h>
int Fib(n)
{
	if (n <= 2)
	{
		return 1;
	}
	else
	{
		return n + Fib(n - 1);
	}
}

int main()
{
	int num = 0;
	scanf("%d", &num);
	int ret = Fib(num);
	printf("%d\n", ret);
	return 0;
}

 

 

Fib(7)を計算すると、Fib(3)が5回繰り返し計算されます。非常に大きなフィボナッチ数を計算すると、基礎となる計算量も非常に大きくなり、計算時間は10分以上になります。数時間。
システムによってプログラムに割り当てられるスタックスペースは限られていますが、スタックスペースを開いたままにしておくと、最終的にスタックスペースが使い果たされる可能性があります。この現象はスタックオーバーフローと呼ばれます。
上記の問題を解決する方法:
再帰を非再帰、つまりループに書き換えます。

// 求 n 的阶乘
int fun(int n)
{
	int tmp = 1;
	while (n > 1)
	{
		tmp *= n;
		n --;
	}
	return tmp;
}

この書き方では、数字が何度も繰り返されることはありません。

ノート:

多くの場合、ソリューションは再帰的です。これは、非再帰的なコードよりも単純だからです。
問題のデータが非常に大きい場合、再帰を使用してそれを実装することは非常に不合理です。現時点では、ループ実装を使用することで問題を補うことができます。

再帰は、一部の特殊な場合にのみ使用されます。

データ構造を学べば、スタックの構造がわかるでしょう。関数の再帰は元々スタックの一種であり、ファーストイン、ラストアウトでもあります。

関数の再帰をマスターするには、多くの練習が必要です。

おすすめ

転載: blog.csdn.net/qq_54880517/article/details/123697773