C语言递归函数,输出1到n到1



例如:对于n = 5,结果应该是:123454321。我已经设法用两个函数这样做了,它们将一个接一个地被调用:第一个用于将1打印到n,第二个用于将n-1打印到1:

void oneToN(int num)
{
if (num == 1)
printf("%d",num);
else
{
oneToN(num-1);
printf("%d",num);
}
}
void NToOne(int num)
{
if(num >= 2)
{
printf("%d", num - 1);
NToOne(num - 1);
}
}

我想知道是否可能只有一个递归函数

是有可能的。下面是关于如何处理递归问题的一般计划:

  • 寻找不需要递归调用的琐碎情况
  • 想象你有一个正在工作的函数,你所需要做的就是想出这个函数的一个额外步骤

在这里,您会发现一个简单的模式:如果您有一个打印2345432的函数,那么您所需要做的就是在它周围打印1。因此,您需要提供两个数字—fromto。当数字相同时,打印一份,就完成了。否则,打印from,执行递归调用,然后再次打印from。完成了!

123454321是1 + 2345432 + 1
2345432是2 + 34543 + 2
34543是3 + 454 + 3

看到模式了吗?

函数应该输出当前数字两次,并递归调用处理中间较大的数字。

void f(int n, int i) {
if (i == n) {
printf("%d", i);
} else {
printf("%d", i);
f(n, i + 1);
printf("%d", i);
}
}

这可以通过分解前面(或后面)的printf来简化。

void f(int n, int i) {
printf("%d", i);
if (i < n) {
f(n, i + 1);
printf("%d", i);
}
}

在实践中我仍然会使用第二个(非递归)函数。

void _f(int n, int i) {
printf("%d", i);
if (i < n) {
_f(n, i + 1);
printf("%d", i);
}
}
void f(int n) {
if (n > 0) {
_f(n, 1);
}
printf("n");
}

使用NToOne(1, 4)调用这样的函数应该足够了。

#include <stdio.h>
void
NToOne(int num, int max)
{
printf("%d", num);
if(num < max)
NToOne(num + 1, max);
else if (num == max)
printf("%d", num+1);
printf("%d", num);
}
void
print_1_to_n_to_1(int n)
{
NToOne(1, n-1);
}
void
main(void)
{
print_1_to_n_to_1(5);
}

我是这样做的,通过使用单个递归函数

#include<iostream>
using namespace std;
//Recursive Function
void func(int n,int i){
if(i<=n){
cout<<i;
func(n,++i);
}
if(i<=n)
cout<<i-1;
}
int main(){
int n;
cin>>n;
func(n,1);
return 0;
}

我们可以很容易地得到这种模式,只有一个递归函数叫做'work'(https://i.stack.imgur.com/yUzJN.jpg)

相关内容

  • 没有找到相关文章

最新更新