此图案如何用递归算法做 * ** *** **** **** *** ** * 只用一个参数
1楼用到了微软Visual Studio里才有的__min函数,为了增强移植性,自己写min函数更好
我之前说2楼不是递归,而是迭代,是有理由的,你仔细看看你写的递归出口条件,还能更迭代点么。你是在用典型的迭代方法来模拟递归函数,你贴出的递归的定义恰恰说明了你的错误,我怀疑你根本没仔细看过定义,纯粹因为我指出了你的错误而在这发泄情绪。
递归的重要性质有两条,一条是递归出口条件,我的程序里if(n>0)就保证了f2(0)无任何输出,正是典型的递归出口条件;第二条性质是调用自身,我在f2(n)里调用f2(n-1),在f3(n)里调用f3(n-1),这不叫调用自身叫什么。做人要客观。
你的这句话“递归指的是调用自身,你那个完全不是递归,根本没有迭代,没有迭代怎么形成递归。”相当地令人匪夷所思。众所周知,递归和迭代根本是两码事,什么叫“没有迭代怎么形成递归”。典型的迭代是for/while loop,根据index的递进/递减来执行不同的操作,和递归有什么关系。理清思维再发言如何。
另外,我用了两个递归函数,是为了功能的分解,然后再在f4()中把两个包装起来。这是很普遍、实用、成熟的软件设计方法,并不是很多人想的那样把所有功能都堆在一起来实现最好。这和我是否使用了递归毫无关系,你拿这个来说事相当无聊。
公平地讲,最简洁美观的其实是 缃虞帱 同学的代码,但是__min()的使用影响了移植性,所以我有所保留。而那位一被人指出错误就大喊大嚷的同学,你那用4个for loop来实现所谓递归的函数,真是前所未见。
我知不知道什么是递归函数,恐怕你还没有资格评判,你的态度我倒是第一次在这个C/C++版块看见。“虚心使人进步”,与你共勉。
我的代码如下
说明:
1. f()是迭代法,这里只是为了展示,可以去掉
2. f2()是递归打印顺三角
3. f3()是递归打印倒三角
4. f4()是把f2(), f3()结合起来,在main中只需要调用f4()即可。
-----------------------------------------------------------------------
#include <stdio.h>
void f(int n){ //iterative method
int i, j;
for(i=1; i<=n; i++){
for(j=0; j<i; j++){
printf("*");
}
printf("\n");
}
for(i=n; i>0; i--){
for(j=0; j<i; j++){
printf("*");
}
printf("\n");
}
}
void f2(int n){
if(n>0){
f2(n-1);
int i;
for(i=0; i<n; i++){
printf("*");
}
printf("\n");
}
}
void f3(int n){
if(n>0){
int i;
for(i=0; i<n; i++){
printf("*");
}
printf("\n");
f3(n-1);
}
}
void f4(int n){
f2(n);
f3(n);
}
int main(){
f4(4);
return 0;
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。