递归函数,可打印从N到1,然后从1到N的所有整数

时间:2018-09-12 19:25:14

标签: c recursion

我只是想问一下如何考虑到N是由用户给定的,如何使用步骤-+ 2和递归函数显示从N到1再到N的所有整数。例如,如果用户给出7,则调用该函数将打印<< 7 5 3 1 3 5 7 >>,或者如果参数为8,则将打印<< 8 6 4 2 4 6 8 >>计算出显示N到1(或N到2)。这是我的代码:

    int main()
{
    int a;
    printf("Give a:");
    scanf("%d", &a);
    func(a);
    return 0;
}

int func(int n)
{
    printf("\t%d",n);
    if (n==1 || n==2)
    {
        return 1;
    }
    return func(n-2);
}

7 个答案:

答案 0 :(得分:2)

显然,我必须假设其他人不是。要么就是他们喜欢钝的代码。

void func(int n)
{
    if (n > 2)
    {
        printf("%d ", n);
        f(n-2);
    }
    printf("%d ", n);
}

应该是所需要的。下面的直播示例

代码

#include <stdio.h>

void f(int n)
{
    if (n > 2)
    {
        printf("%d ", n);
        f(n-2);
    }
    printf("%d ", n);
}

int main()
{
    for (int i=0; i<=10; ++i)
    {
        f(i);
        fputc('\n', stdout);
    }
}

输出

0 
1 
2 
3 1 3 
4 2 4 
5 3 1 3 5 
6 4 2 4 6 
7 5 3 1 3 5 7 
8 6 4 2 4 6 8 
9 7 5 3 1 3 5 7 9 
10 8 6 4 2 4 6 8 10 

答案 1 :(得分:1)

这是一种简单的方法(该步骤也是可配置的)。向下滚动到 1 ,打印数字并调用自身(也打印小于step(中间的那个值,如果有的话)的值)一次 strong>-import React from "react"; const ImageList = props => { if ( props.imagePath === undefined || props.imagePath === null || props.imagePath.length === 0 ) return null; const path = props.svgsArray.find( str => str.indexOf(props.imagePath.hash) > 1 ); return <img src={path} alt={props.imagePath.hash} className={props.styles} />; }; export default ImageList; 分支),然后从递归返回(在堆栈上)时,它将以相反的顺序再次打印数字(第2个 nd else)。

程序将继续执行,直到用户输入 n 的无效值(包括非正 int )为止。

code.c

printf

输出

#include <stdio.h>

#define STEP 2


void func(int n, unsigned int step) {
    if (n > step) {
        printf("%d    ", n);
        func(n - step, step);
        printf("%d    ", n);
    } else if (n >= 1) {
        printf("%d    ", n);
    }
}


int main() {
    int n = 0;
    while (1) {
        printf("\n\nEnter n (invalid, to exit): ");
        if ((!scanf("%d", &n)) || (n <= 0)) {
            break;
        }
        printf("\nResults for %d (with a step of: %d):\n", n, STEP);
        func(n, STEP);
    }
}

答案 2 :(得分:0)

#include <stdio.h>


int a;
int forward = 0;

int main() { 
    printf("Give a:");
    scanf("%d", &a);
    func(a);
    return 0; 
}

int func(int n)

{ 
    printf("\t%d \n",n);
    if (forward != 1 ) {
        if (n==1 || n==2)
        {
            //start printing from 1 or 2 to N
            forward = 1;
            func(n+2);
        } else {
            return func(n-2); 
        }
    } else {
       if(n >= a) {
            return;
        }
        return func(n+2);
    }
}

答案 3 :(得分:0)

使用静态变量。

#include <stdio.h>

void func(int n);

int main()
{
  int a;

  printf("Give a:");    
  scanf("%d", &a);  
  func(a);
  return 0;
}

void func(int n)
{
  static char reverse;
  static char init = 1;
  static int  val;

  if (init)
  {
      val = n;
      init = 0;
  }

  printf("%d\t",n);    

  if (n <=2 ) {
    reverse = 1;
  }   

  n += (reverse) ? 2 : -2;

  if (n > val) return;

  func(n);
}

输出:

7       5       3       1       3       5       7

答案 4 :(得分:0)

这是我的解决方案。我敢肯定还有更好的选择,但还是...

void rec(int n) {
    if (n%2==1 &&n==1) { printf("\t1"); return; }
    else if(n%2==0 && n==2)
    {
        printf("\t2");return;
    }
    printf("\t%d",n);
    rec(n-2);
    printf("\t%d",n);
}
int main()
{
    rec(7);
    return 0;
}

希望这很有帮助!

答案 5 :(得分:0)

我会有某种类型的计数器,当您向上时,您可以将其“打开”。将计数器以及原始数字传递到func()中。

我不确定确切的语法,因为我在C ++工作一年后刚接触C,但这是我会做的。

counter = 0;
int func(int n, int counter, int originalNum)
{
    printf("\t%d",n);

    if(counter == 0)
    {
        if (n==1 || n==2)
        {
            counter = 1;
            return func(n+2, counter, originalNum);
        }
        return func(n-2, counter ,originalNum);
    }
    else
    {

        if (n == originalNum)
        {
            return 1;
        }
        return func(n+2, counter, originalNum);
    }

}

答案 6 :(得分:0)

为了娱乐,我认为我会尝试改善@WhozCraig的良好答案,并编写一个函数以不仅打印序列,而且根据要求输出间距和前哨,并且在最后一个数字后也不要尾随空格

7, then calling the function would print <<7 5 3 1 3 5 7>> ...
8, it would print <<8 6 4 2 4 6 8>>

诀窍在于,该函数需要知道它是第一个调用(打印"<<%d"">>"还是可重入的调用。因为OP没有为负指定行为)值,下面的func()使用符号来表示首次或重入呼叫。

#include <stdio.h>

void func(int n) {
  if (n > 0) {
    printf("<<%d", n);
    if (n > 2) {
      func(-(n - 2));
      printf(" %d", n);
    }
    printf(">>\n");
  } else {
    n = -n;
    printf(" %d", n);
    if (n > 2) {
      func(-(n - 2));
      printf(" %d", n);
    }
  }
}

int main(void) {
  for (int a = 1; a<= 10; a++) {
    func(a);
  }
}

输出

<<1>>
<<2>>
<<3 1 3>>
<<4 2 4>>
<<5 3 1 3 5>>
<<6 4 2 4 6>>
<<7 5 3 1 3 5 7>>
<<8 6 4 2 4 6 8>>
<<9 7 5 3 1 3 5 7 9>>
<<10 8 6 4 2 4 6 8 10>>

就个人而言,该代码可能会有所改进,但所发布的代码正是我第一次键入和编译的。我从未为完整的程序编写过如此多的代码,而该程序完全可以按需工作,而无需编辑:red letter day