递归如何在这个数字逆转计划中起作用?

时间:2016-12-07 14:50:06

标签: c

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>

// ex06_18.c
// What does this program do?

#define SIZE 10

// function prototype
void someFunction( const int b[], size_t startSubscript, size_t size );

// function main begins program execution
int main( void )
{
    int a[ SIZE ] = { 8, 3, 1, 2, 6, 0, 9, 7, 4, 5 }; // initialize a

    puts( "Answer is:" );
    someFunction( a, 0, SIZE );
    puts( "" );

    _sleep(1000*100);

} // end main

// What does this function do?
void someFunction( const int b[], size_t startSubscript, size_t size )
{
    if ( startSubscript < size ) 
    {
        someFunction( b, startSubscript + 1, size );

        printf( "%d ", b[ startSubscript ] );
    } // end if
} // end function someFunction

someFunction( b, startSubscript + 1, size ) - 你能解释这部分吗?我调试了它,但很难理解递归部分如何处理?

3 个答案:

答案 0 :(得分:1)

它将重新调用该函数,直到startSubscript变量大于size变量,然后我们可以说索引是a数组上的最后一个值,然后它将回到第一个调用(我们在0索引上)。

致电:

Call #   |       Function call       | Return  | Outputs  
1          someFunction( a, 0, 10 )      -         -
2          someFunction( a, 1, 10 )      -         -
3          someFunction( a, 2, 10 )      -         -
4          someFunction( a, 3, 10 )      -         -
5          someFunction( a, 4, 10 )      -         -
6          someFunction( a, 5, 10 )      -         -
7          someFunction( a, 6, 10 )      -         -
8          someFunction( a, 7, 10 )      -         -
9          someFunction( a, 8, 10 )      -         -
10         someFunction( a, 9, 10 )      -         -
11         someFunction( a, 10, 10)      -         -

10&lt; 10? 错误这里我们停止递归调用,然后再返回到从main调用的第一个调用。 :

我们可以看到,每当我们重新调用someFunction时,printf( "%d ", b[ startSubscript ] );就会因为递归而无法访问Call # | Function call | Return | Outputs (a[startSubscript]) 10 someFunction( a, 9, 10 ) - 5 9 someFunction( a, 8, 10 ) - 4 8 someFunction( a, 7, 10 ) - 7 7 someFunction( a, 6, 10 ) - 9 6 someFunction( a, 5, 10 ) - 0 5 someFunction( a, 4, 10 ) - 6 4 someFunction( a, 3, 10 ) - 2 3 someFunction( a, 2, 10 ) - 1 2 someFunction( a, 1, 10 ) - 3 1 someFunction( a, 0, 10 ) - 8

支持:

onItemClicked

不,我们可以看到阵列已被“逆转”

答案 1 :(得分:0)

该函数总是使用参数startSubscript +1调用自身,直到startSubscript等于SIZE。然后,具有最大数字的函数调用意味着具有size == startsubscript的那个将结束。从那里开始,函数调用将以向后的方式处理结束。向后意味着(后进先出逻辑)。

提示:总是使用较小的数字重现递归,以查看最新情况

答案 2 :(得分:0)

以相反顺序显示数组的一种方法如下:

  • 首先,以相反顺序显示由除第一个元素之外的所有元素组成的子数组。
  • 然后,显示第一个元素。

第一个项目是递归实施的。当数组的大小为0时递归结束,在这种情况下你什么都不做。

这正是someFunction的功能。