C言語演習(再帰)

目次

1. 整数値 (符号なし) を受け入れ、その各ビットを順番に出力します。

2. 関数を作成する場合、文字列の長さを調べるための一時変数を作成することはできません。

3. n の階乗を求めます。(オーバーフローは考慮していません)

4. n 番目のフィボナッチ数を見つけます。(オーバーフローは考慮していません)

5.関数 reverse_string(char * str) を作成します (再帰実装)

6. 再帰関数 DigitSum(n) を作成し、負でない整数を入力し、それを構成する数値の合計を返します。

7. nのk乗を実現する関数を書き、再帰を使用して実現します。


1. 整数値 (符号なし) を受け入れ、その各ビットを順番に出力します。

例:
入力: 1234、出力 1 2 3 4

アイデア: 考えるべきことは、print 関数はすべてのビットを出力できるということです。これは、次のような一連の考えにつながります。
print(1234)
print(123) 4 まず 123 の各桁を出力し、次に 4 を出力します。
print(12) 3 4 まず 12 の各桁を出力し、次に 3 を出力します。print 4.
print(1) 2 3 4 …..

#include <stdio.h>

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


}

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

2. 関数を作成する場合、文字列の長さを調べるための一時変数を作成することはできません。

私たちの関数は毎回文字列の長さを必要とし、渡されるパラメータは文字列の最初のアドレスのみです。その後、最初の文字の長さを計算し、1 つずつ再帰します。 

my_strlen("abcd")     
1 + my_strlen("bcd")
1+1+my_strlen("cd")
1+1+1+my_strlen("d")
1+1+1+1+my_strlen("")

int my_strlen(char* str)
{
	if (*str != '\0')
	{
		return 1 + my_strlen(str+1);
	}
	else
		return 0;
}

int main()
{
	char arr[] = "abcd";
	int len = my_strlen(arr);
	//len = strlen(arr);
	printf("%d\n", len);
	
	return 0;
}

3. n の階乗を求めます。(オーバーフローは考慮していません)

アイデア: n = n*(n-1)*(n-2)....*1 の階乗、そして私たちが定義した fac 関数は階乗を見つけることなので、n の値を渡すだけです。毎回入るだけです。

int fac(int n)
{
	if (n <= 1)
		return 1;
	else
		return n * fac(n - 1);
}

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

4. n 番目のフィボナッチ数を見つけます。(オーバーフローは考慮していません)

アイデア: フィボナッチ数列: 1 1 2 3 5 8 13 21 34 55... そして、この特性に基づいて数式を書くことができます。次に、コードを書きます。

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

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

5.関数 reverse_string(char * str) を作成します (再帰実装)

実装: パラメーター文字列内の文字を逆の順序で出力するのではなく、逆にします。

要件: C 関数ライブラリ内の文字列操作関数は使用できません。

例: 「abcdef」は「fedcba」になります。

アイデア: reverse_string 関数が呼び出されるたびに、文字列の最初と最後の 2 文字が最初に交換されますが、最後の文字は文字 '\0' で埋める必要があることに注意してください。新しい文字列を取得する必要があります。

#include <stdio.h>
#include <string.h>

void reverse_string(char* str)
{
	int len = strlen(str);
	char tmp = *str;
	*str = *(str + len - 1);
	*(str + len - 1) = '\0';

	if (strlen(str + 1) >= 2)
		reverse_string(str + 1);

	*(str + len - 1) = tmp;
}

int main()
{
	char arr[] = "abcdef";
	reverse_string(arr);

	printf("%s\n", arr);
	return 0;
}

6.再帰関数 DigitSum(n) を作成し、負でない整数を入力し、それを構成する数値の合計を返します。

たとえば、DigitSum(1729) を呼び出すと、1+7+2+9 が返され、合計は 19 になります。

入力: 1729、出力: 19

アイデア: アイデアは最初の質問とほぼ同じです。

#include <stdio.h>

int DigitSum(int n)
{
	if (n > 9)
    	return (n % 10) + DigitSum(n / 10);
	else
		return n;
}

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

7. nのk乗を実現する関数を書き、再帰を使用して実現します。

アイデア: k の値に注意してください。 

double power(int n, int k)
{
	if (k > 0)
		return n * power(n,k - 1);
	else if(k == 0)
		return 1;
	else
		return 1.0 / power(n, -k);
}

int main()
{
	int n = 0;
	int k = 0;
	scanf("%d %d", &n,&k);
	double ret = power(n, k);
	printf("%.1f\n", ret);
	return 0;
}

おすすめ

転載: blog.csdn.net/m0_63562631/article/details/125558351
おすすめ