函数递归举例
1.实现将一个整数转换成二进制表示的字符串(使用函数递归)
#include <stdio.h>
void decToBin(int n) {
if (n == 0) {
return;
} else {
decToBin(n / 2);
printf("%d", n % 2);
}
}
int main() {
int num = 23;
printf("%d的二进制表示为:", num);
decToBin(num);
printf("\n");
return 0;
}
解答:
在上面的程序中,我们定义了一个decToBin()
函数,它用于将一个十进制数转换为二进制字符串。该函数接收一个整数n
作为参数。当n
为0时,递归终止,否则递归调用decToBin(n/2)
来处理下一个二进制位,再输出当前位的值n%2
。最终输出的字符串就是整数num
的二进制表示。
在main()
函数中,我们调用decToBin()
函数将23转换为二进制字符串,并打印结果。输出结果为:
23的二进制表示为:10111
需要注意的是,在递归函数中,每次递归调用都会占用一些栈空间,因此递归深度过大时可能会导致栈溢出的风险,因此需要注意控制递归深度。
2.编写一个函数,利用递归实现计算斐波那契数列中第n个数的值,其中斐波那契数列的定义如下
F(0) = 0
F(1) = 1
F(n) = F(n-1) + F(n-2) (n≥2)
答案:
#include <stdio.h>
int Fibonacci(int n)
{
if (n == 0)
{
return 0;
}
else if (n == 1)
{
return 1;
}
else
{
return Fibonacci(n-1) + Fibonacci(n-2);
}
}
int main()
{
int n, result;
printf("请输入要计算斐波那契数列的第n项:");
scanf("%d", &n);
result = Fibonacci(n);
printf("斐波那契数列中第%d项的值为%d", n, result);
return 0;
}
解答:
这个程序中,我们利用递归的方法实现了Fibonacci函数。当n为0或1时,我们可以直接返回对应的值;当n大于1时,我们则返回Fibonacci(n-1) + Fibonacci(n-2)。主函数中,我们通过用户输入来确定要计算的斐波那契数列的第n项,然后调用Fibonacci函数来计算该项的值,并输出结果。
3.编写一个递归函数,计算给定的正整数n的阶乘。
解答:
递归函数的基本思路是将大问题化解为小问题,通过重复调用函数并将参数逐步缩小,最终解决问题。
对于阶乘问题,我们可以通过将n的阶乘化解为n-1的阶乘乘以n来递归计算。
具体实现如下:
#include <stdio.h>
int factorial(int n) {
if (n == 1) { // 基线条件
return 1;
} else {
return n * factorial(n - 1); // 递归条件
}
}
int main() {
int n;
printf("请输入一个正整数:");
scanf("%d", &n);
printf("%d的阶乘为%d\n", n, factorial(n));
return 0;
}
在这个例子中,我们定义了一个函数factorial,该函数接受一个参数n,表示要计算n的阶乘。首先进行基线条件判断,即当n等于1时,返回1。如果不是基线条件,那么就调用自身并将参数n-1传入,直到n等于1为止。
我们在main函数中输入一个正整数,并调用factorial函数进行计算。输出结果为输入的正整数n的阶乘。
需要注意的是,递归函数虽然灵活,但也容易导致栈溢出等问题。因此,我们需要在编写递归函数时慎重考虑。使用递归实现计算一个数的阶乘。
答案:
#include <stdio.h>
int factorial(int n){
if(n <= 1){
return 1;
}
else{
return n * factorial(n-1);
}
}
int main(){
int n;
printf("请输入一个正整数:");
scanf("%d", &n);
int result = factorial(n);
printf("%d的阶乘为:%d\n", n, result);
return 0;
}
解答:
函数 factorial
使用递归的方式实现了计算一个数的阶乘。当 n <= 1 时,返回 1,否则返回 n * factorial(n-1)。在 main 函数中,我们从用户读入一个正整数 n,并调用 factorial 函数计算 n 的阶乘,最后输出结果。
4.递归方式实现打印一个整数的每一位
递归函数print_digits()的作用是打印整数num的每一位。首先判断num是否小于10,如果是,则直接打印num。否则,递归调用print_digits()函数打印num除以10的商,再打印num除以10的余数。这样就可以逐位打印整数num了。在程序中,设置num的值为12345作为例子进行测试
#include <stdio.h>
void print_digits(int num) {
if (num < 10) {
printf("%d", num);
return;
}
print_digits(num / 10);
printf("%d", num % 10);
}
int main() {
int num = 12345;
print_digits(num);
return 0;
}
5.汉诺塔
解答:
在函数的内部,如果只有一个盘子,我们直接将它从起始杆移动到目标杆。如果盘子数n大于1,我们递归调用自己三次。首先,我们将n-1个盘子从初始杆移动到辅助杆,然后将第n个盘子从起始杆移动到目标杆,最后将n-1个盘子从辅助杆移动到目标杆
答案:
#include<stdio.h>
void hanoi(int n, char A, char B, char C) {
if (n == 1) {
printf("Move disk 1 from rod %c to rod %c\n", A, C);
return;
}
hanoi(n - 1, A, C, B);
printf("Move disk %d from rod %c to rod %c\n", n, A, C);
hanoi(n - 1, B, A, C);
}
int main() {
int n;
printf("Enter number of disks: ");
scanf("%d", &n);
hanoi(n, 'A', 'B', 'C');
return 0;
}
在此程序中,hanoi() 函数用于递归地将汉诺塔问题拆分为更简单的子问题,直到只剩下一个盘子。然后,我们打印一个消息来移动单个盘子。在这之后,程序再次递归地调用 hanoi() 函数,这次将顶部的盘子从缓冲杆 B 移动到目标杆 C,同时使用源杆 A 作为缓冲杆。重复这个过程,直到所有盘子都从源杆 A 移动到目标杆 C。