开发者社区> 问答> 正文

此图案如何用递归算法做 * ** *** **** **** *** ** * 只用一个参数

此图案如何用递归算法做 * ** *** **** **** *** ** * 只用一个参数

展开
收起
知与谁同 2018-07-16 20:33:56 1632 0
4 条回答
写回答
取消 提交回答
  • 杀人者,打虎武松也。
    #include <cstdio>
    using namespace std;

    /*
    *
    */
    int print(int n)
    {
    int i,j;
    if(n>0)
    {
    for(i=1;i<=n;i++)
    {
    for(j=0;j<i;j++)
    {
    printf("*");
    }
    printf(" ");
    }
    print(-n);
    }
    else
    {
    for(i=-n;i>0;i--)
    {
    for(j=0;j<i;j++)
    {
    printf("*");
    }
    printf(" ");
    }
    return 0;
    }
    return 0;
    }
    int main() {
    print(4);
    return 0;
    }
    这是用C++写的,print函数只用了一个参数,这个参数表示你中间的星星数目。
    如果有其他要求请补充,如果你需要空行的话,把中间输出的空格换成空行就行了。
    说我不是递归是迭代的,你回去好好看看书吧,你那个算什么递归。你那个叫函数嵌套。查百度百科看递归的定义去,对你彻底无语了。
    http://baike.baidu.com/view/96473.htm
    递归做为一种算法在程序设计语言中广泛应用.是指函数/过程/子程序在运行过程中直接或间接调用自身而产生的重入现象.递归是计算机科学的一个重要概念,递归的方法是程序设计中有效的方法,采用递归编写程序能使程序变得简洁和清晰.。
    递归指的是调用自身,你那个完全不是递归,根本没有迭代,没有迭代怎么形成递归。
    无语极了,这里的三个代码里面只有我的是递归的,虽然我没有每步都用递归,但是我是递归打印出来的,楼主可以拿这几个代码去问问老师,看这是不是递归,我可以肯定我的是最符合要求的。
    那个说我不是递归的,你那个f()是迭代。搞笑死我了。
    2019-07-17 22:54:57
    赞同 展开评论 打赏
  • #include <stdio.h>

    int f(int n)
    {
    if(n==1)
    {
    printf("*");
    return 1;
    }
    else
    {
    printf("*");
    return f(n-1);
    }
    }

    void main()
    {
    int i;
    for(i=1;i<=8;i++)
    {
    if(i>4)
    {
    f(9-i);
    }
    else
    {
    f(i);
    }
    printf("\n");
    }
    }
    2019-07-17 22:54:57
    赞同 展开评论 打赏
  • 12535

    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;

    }

    2019-07-17 22:54:57
    赞同 展开评论 打赏
  • TA有点害羞,没有介绍自己...
    #include<stdio.h>
    #include<stdlib.h>

    void pf(int n);

    int main()
    {
    pf(8);
    return 0;
    }

    void pf(int n)
    {
    for(int i=0;i<__min(n,9-n);i++)
    putchar('*');//输出*
    putchar('\n');//换行
    if(n>1)
    pf(n-1);//如果没有输完,继续递归。
    }
    2019-07-17 22:54:56
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
数据+算法定义新世界 立即下载
袋鼠云基于实时计算的反黄牛算法 立即下载
Alink:基于Apache Flink的算法平台 立即下载