C语言知识点:递归练习

练习1. 顺序打印整数的每一位数

这个题的意思就是,输入一个整数,如520,然后顺序打印每一位的数字,就是先打印5 再打印2 最后打印0。

这个的代码可以依靠递归来很好的实现。

首先来上代码:

很简短的代码,所谓递归就是不断的调用函数自己。

在 sequence_print(int n) 函数中,线做一个判断,if(n > 9),就进行递归。其逻辑上,当我们输入520的时候,520 > 9, 然后再进入函数,此时参数变成 n/10, 也就是 52 进入函数,52 > 9, 再进入函数,参数变成了 5, 此时 5  <  9,开始打印:先打印 5%10 == 5;然后回到参数为 52 的时候的函数,打印 52%10 == 2; 再回到参数为 520 时候的函数,打印 520%10 == 0;

最后呈现的就 5 2 0,整体思想就是先递,再归的过程。

当满足 n > 9的条件时,无限进入 sequence_print(n/10), 当不满足条件时,再依次回去。

如果还是不太懂,我上一篇关于递归的文章中有图,大家可以看一下。

练习2. 斐波那契数列

关于这个题目,首先我先解释一下什么是斐波那契数列:也就是每一项是前两项的和。

比如计算截止到第五位的斐波那契数列的和,就是0 1 1 2 3: 0+1=1,1+1=2,1+2=3,2+3=5

5 的前两项是 2 和 3, 3 的前两项是 2 和 1 …………

那么就直接先上代码:

输入 n ,代表计算截止第n位的斐波那契数列的结果,比如我们输入 n = 6,那么就是计算到第六位,应该是 0+1=1,1+1=2,1+2=3,2+3=5,3+5=8

现在我们来盘一下里面的逻辑,首先,我们输入 n=5,也就是计算到第五位

然后 n 进入函数,判断 != 0 也 != 1,然后再进入函数,参数变成了n-1和n-2,就是 Fib(4) 和 Fib(3) ,都不满足条件,继续进入,Fib(4) 分成了Fib(3) 和 Fib(2);Fib(3)分成了Fib(2) 和 Fib(1);然后每个再分裂,直到满足判断条件,Fib(1) == 1,Fib(0) == 0,Fib(2) == Fib(1)+Fib(0),Fib(3) == Fib(1)+Fib(2)…………直到回到 Fib(5) == Fib(4)+Fib(3),最后计算完毕,返回值。

所以虽然我们计算使步骤不多,但是在递归中会不断的分裂。如果我们要计算第50位,那就是个非常庞大的计算量了,如图:

所以递归虽然看起来减少了代码量,但是其需要的计算量却非常庞大,其中包含很多的重复计算。所以一般推荐步骤很多的计算采用迭代(循环)来解决,步骤少的计算可以用递归。

小结:

递归是一种大事化小的思想,但也会产生不必要的重复计算,因此要合理使用递归和迭代。

最近作业很多,所以断更很长时间,接下来会不定时更新关于 Java语法 和 C语言指针 相关的知识。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值