函数递归举例

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。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值