Ciallo~(∠・ω< )⌒☆
先来看几个例子
栗子1:
写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
输入:1729,输出:19
ANSWER:
int DigitSum(int n)//1729
{
if(n>9)//限制条件!!!!!!
return DigitSum(n/10)+n%10;
else
return n;
}
画图理解:
解释:拆解然后相加,1729
ONE:第一步:拆成172和9; 第二步:将上一步的172拆解成17和2 后面思路亦是如此
TWO:拿第一步归纳, a;首先如何得出'9',那就用1729%9
b:如何得出'172'那就是1729/10
THREE:由此得出公式是.Digsum(n%10)+n%10
一点心得:在传递的这个过程里,上面图里面每次传递不是都要经过Digsum(int 10)嘛,所以我觉得这个东西的功能似乎更多是用来定位下面准备用哪一个函数的(自己调用自己罢了),定位到了以后接着往下走,走到了Digsum(n%10)+n%10,这个东西的意思不仅仅是用来告诉你你刚才调过来的数据是要套用这里面的公式,也是告诉你用这个公式得到的数据接下来要传递到哪个函数里面接着运行的.
总而言之,你可以将两个函数名看成是一个是发射点,一个是坐标点.
这样才保证了循环的进行,有点像莫比乌斯环(想象一下蛇吞食自己的尾巴),但是这个递归必须有限定条件(在蛇的身体里塞一个障碍物),不然真就成了莫比乌斯环.
用一句话总结递归,蛇吞尾巴,触障(碍)反弹.(*/ω\*)
栗子2,3,4都是这个思路,不再赘述.
栗子2:
算5的阶乘
ANSWER:
int Fact(int n)
{
if(n<=0)//限制条件!!!!!!
return 1;
else
return n*Fact(n-1);
}
1
画图理解:
栗子3:
输⼊⼀个整数m,打印这个按照顺序打印整数的每⼀位。
例如:输入1234,输出1 2 3 4.
ANSWER:
int print(int a)
{
if (a > 9)//限制条件!!!!!!
{
print(a / 10);
}
printf("%d\n",a %= 10);
return a;
}
int main()
{
int n = 0;
scanf("%d", &n);
print(n);
return 0;
}
画图理解:
栗子4:
模拟实现pow函数
ANSWER:
int Pow(int n, int k)
{
if(k==0)//限制条件!!!!!!
return 1;
else if(k>=1)
{
return n*Pow(n, k-1);
}
}
画图理解:
用3^3举/例
才发现上面的图最后都没有写限制条件,毕竟只有这个是写这篇博客的时候才写的,不管了,大家懂我意思就好,上面图有时间再重置.
心得(方法论):有可能有错误,但确实是看了好几个栗子才有的一点点想法.
从上面的例子可以看出来,递归就是把一个大的问题化成许多小的问题
可以这么理解,递归就是先拆解一个问题,但是我每次拆解好了一个问题之后又多出了一个新的问题,然后我再拆,拆到最后没有新的问题了(这一步叫'递')
我就开始解决前面每次拆出来的问题从下到上依次解决(这叫'归'):
用"递"最后得到的结果从下到上依次往前带(套进去),依次解决之前拆出来的问题,到最后我们就解决了最初想要解决的问题.
解决这类问题的思考思路:
首先,我们需要明确我们需要将这个大问题拆解成哪样的两个小问题(或者不只是两个?也许有更多?以我目前所见,只见过两个,但我相信万变不离其宗),需要什么样的公式才可以将这个大问题拆解然后.
在这两个小问题中,我们需要找准其中一个问题继续使用一致的方法将这个问题继续拆解
拆解到最后,再依次带入刚才依次拆解所生成的小问题中,向上回溯,最终解决最初的大问题
如果还不理解我就举一个最贴切我们生活的例子,就举一个我们中学时常见的简单的物理题目吧(自己编的)
求一个正方体的动能:速度v,体积V,边长度a皆为已知量.
就这样.