今天是星期五,满课,学得有点累,就不搞一些难的问题。
就简单复习一下今天上课的内容吧。
今天主要讲了递归函数的相关知识。
一句话概括:递归是一个调用自己的函数。
当原问题和子问题具有相似性时,求解原问题时将原问题转变为求解子问题,对于子问题又进一步转化为对子问题的子问题的求解,直到当子问题小到一定规模或满足一定条件时,问题的解已知。那么从已知的解,沿着原来分解问题的路线倒推回去,最终就能得到原问题的解。
原问题和子问题的这种相识性被称为“自相似性”。
这样讲可能还是有点模糊,直接上代码!
#include<stdio.h>
//factorial,阶乘
int factorial(int n)
{
if(n==1)
return 1;
return factorial(n-1)*n;
}
int main()
{
int n;
scanf("%d",&n);
printf("%d",factorial(n));
return 0;
}
这是递归学习当中最简单最具代表性的问题:求阶乘。
当n不等于1的时候,factorial函数的返回值为n*factorial(n-1)。
拿n=3举例,第一次调用f函数(factorial函数)时,传入的参数为3,返回值为f(3-1)*3,在返回值里再次调用f函数,此时传入的参数为2,返回值为f(2-1)*2,此时返回值又一次调用f函数,传入的参数为1,此时调用的返回值为1。
众所周知,调用函数的地方的值可以用函数返回值来代替,也就是说f(3)可以用f(2)*3代替,f(2)可以用f(1)*2代替,f(1)可以用1代替,综上,f(3)可以用3*2*1代替,也就实现了阶乘。
函数f在一次次调用自己的过程中减小了参数的值,“直到当子问题小到一定规模或满足一定条件时,问题的解已知。”然后再一步步往回上一级返回值中代,最终就完成了一次递归函数的计算。
本人大一,学艺不精,可能有讲得不够准确得地方,欢迎大家指出,一起进步!
可能也不会有人看到我的文章,反正这也只是自己认真学习的证明,有自己看到就足够了。
接下来有关学习方面而与计算机无关的学习进度我会发在B站,用来记录自己的学习生活,有想要一起学习,一起进步的同学可以关注一下我的B站账号:阿冰阿冰QAQ。现在暂时上面什么都没有发,只有亿些转发抽奖的动态。
重申一遍,一切都是为了学习和记录学习。