我只是想问一下如何考虑到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);
}
答案 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。