尝试使用递归添加数字时获取NaN

时间:2016-03-12 05:35:32

标签: javascript recursion

我试图在没有循环的情况下添加未知数量的参数。这是我到目前为止所做的。

var add = function add() {
  if (!arguments.length) {
    return 0;
  } else {
    var args = [].slice.call(arguments, 0);

    console.log(args[0], arguments);
    args.splice(0, 1);
    return args[0] + add.apply(this, args); //needtoreadaboutapply
  }
}; 

这是我调用add(3,4,5)时得到的输出。 所以我做错了什么以及如何在浏览器控制台中调试这样的递归调用? 3 [3, 4, 5] 4 [4, 5] 5 [5] NaN

3 个答案:

答案 0 :(得分:3)

您正从参数中删除一个元素并访问它。因此,在处理最后一个参数时,该操作将导致问题。当您删除最后一个参数时,数组将为[]为空,此时如果您访问arg[0]将提供undefinedundefined + number = NaN

尝试使用已删除的号码,而不是从阵列中访问它,

var add = function add() {
  if (!arguments.length) {
    return 0;
  } else {
    var args = [].slice.call(arguments, 0);
    var spliced = args.splice(0, 1);
    console.log(args[0], arguments);
    return spliced[0] + add.apply(this, args); //needtoreadaboutapply
  }
}; 

答案 1 :(得分:1)

如果你不习惯使用递归函数,你可能想要研究使用.reduce()

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

DELIMITER $$
DROP PROCEDURE IF EXISTS `appclient.P_GetClientList`$$

CREATE  PROCEDURE `appclient.P_GetClientList`(
  IN V_ReportId INT,
  IN V_PagePerRecordN INT,
  IN V_PageN INT,
  IN V_Condition VARCHAR (4000),
  IN V_SortColIndex VARCHAR (10),
  IN V_SortOrder VARCHAR (10),
  IN V_Param1 VARCHAR (500),
  IN V_Param2 VARCHAR (500),
  IN V_Param3 VARCHAR (500),
  IN V_Param4 VARCHAR (500),
  IN V_Param5 VARCHAR (500),
  IN V_Param6 VARCHAR (500),
  IN V_Param7 VARCHAR (500),
  IN V_Param8 VARCHAR (500),
  IN V_Param9 VARCHAR (500),
  IN V_Param10 VARCHAR (500),
  IN V_IsPdf INT,
  OUT V_TotalPages INT,
  OUT V_TotalRecords INT,
  OUT V_TabCountDetails VARCHAR (500)
)
BEGIN
  DECLARE V_Query VARCHAR (4000) ;
  DECLARE V_OrderBy NVARCHAR (500) ;
  DECLARE V_ClientListId SMALLINT ;
  DECLARE V_Logo NVARCHAR (50) ;
  DECLARE V_Status VARCHAR (10) ;
  DECLARE V_ClientId SMALLINT ;
  DECLARE V_IsManDocsReq BIT ;
  DECLARE V_IsApproveLink BIT ;
  DECLARE V_ThemeId BIT ;
  DECLARE V_IsActive BIT ;
  DECLARE V_IsThemeLogoUploded BIT ;
  DECLARE V_IsRegDocsUploaded BIT ;
  DECLARE V_IsOnlinePayment BIT ;
  DECLARE V_IsConfigurationDone BIT ;
  DECLARE V_IsClientBidTermConfigured BIT ;
  DECLARE V_IsClientBidTermGridLink BIT ;
  DECLARE V_IsClientBidTermCreateLink BIT ;
  DECLARE V_IsCPPPRequired TINYINT ;
  DECLARE V_CPPPClientCount TINYINT ;
  DECLARE V_State BOOLEAN DEFAULT FALSE;
    IF(V_SortColIndex != '' AND V_SortColIndex IS NOT NULL AND V_SortOrder != '' AND V_SortOrder IS NOT NULL) THEN

        SELECT V_OrderBy = CONCAT(RSCD.selectFieldName, ' ', V_SortOrder)
        FROM `appreport.Tbl_ReportSearchColumnDetail` RSCD 
        WHERE RSCD.reportId = V_ReportId AND RSCD.columnId = V_SortColIndex;
    END IF;

    SET @V_Query = CONCAT('SELECT COUNT(1) into @V_TotalRecords  FROM `appclient.tbl_Client` CM INNER JOIN `appclient.tbl_Department` DM ON CM.deptId = DM.deptId 
                     WHERE 1 = 1 ',V_Condition);
    SELECT @V_Query;                 
SELECT @V_TotalRecords;          
  PREPARE stm FROM @V_Query;
  EXECUTE stm USING @V_TotalRecords;
  DEALLOCATE PREPARE stm;


 SET @V_Query1 =  CONCAT('SELECT A.clientId, A.domainName, A.deptName, A.isManDocsReq, A.themeId, A.logo, A.isOnlinePayment,0 AS isApproveLink, 0 AS isClientBidTermCreateLink, 0 AS isClientBidTermGridLink, '''' AS cstatus, A.isActive,A.isCPPPRequired,A.cppCount  
        FROM (SELECT @row_number:=@row_number+1 AS row_number, CM.clientId, CM.domainName, DM.deptName,CM.isManDocsReq, CM.themeId, CM.logo, CM.isOnlinePayment, CM.isActive,CM.isCPPPRequired,CPC.cppCount 
              FROM `appclient.tbl_Client` CM 
              INNER JOIN `appclient.tbl_Department` DM ON CM.deptId = DM.deptId 
              LEFT OUTER JOIN (SELECT clientId,COUNT(clientId) cppCount FROM `appclient.tbl_ClientCPPPConfig` GROUP BY clientId) CPC ON CPC.clientId = CM.clientId,(SELECT @row_number:=0) AS t
              WHERE 1 = 1', V_Condition,') AS A 
              WHERE ',@row_number, ' BETWEEN ' ,CAST((@V_PageN - 1) * @V_PagePerRecordN + 1 AS CHAR)  ,' AND ' ,CAST(@V_PageN * @V_PagePerRecordN AS CHAR)) ;



   SELECT  @V_Query1; 


/*INSERT INTO `ttbl_ClientList` (
    clientId,domainName,deptName,isManDocsReq,themeId,logo,isOnlinePayment,isApproveLink,isClientBidTermCreateLink,isClientBidTermGridLink,cstatus,
    isActive,isCPPPRequired,cppCount
    ) 
    */
   PREPARE stm FROM @V_Query1 ;
   EXECUTE stm; 
   DEALLOCATE PREPARE stm;  -- 

    Loop_lable: WHILE (@V_Query1) DO

        SET V_IsApproveLink = 0;
        SET V_IsThemeLogoUploded = 0;
        SET V_IsConfigurationDone = 0;
        SET V_IsRegDocsUploaded = 0;
        SET V_IsClientBidTermConfigured = 0;
        SET V_IsClientBidTermGridLink = 0;
        SET V_IsClientBidTermCreateLink = 0;
        SET V_ClientId = 0;
        SET V_IsCPPPRequired = 0;
        SET V_CPPPClientCount = 0;

        SELECT V_ClientId = clientId, V_IsManDocsReq = isManDocsReq, V_ThemeId = themeId, V_Logo = logo, 
               V_IsOnlinePayment = isOnlinePayment, V_IsActive = isActive, V_IsCPPPRequired = isCPPPRequired
        FROM ttbl_ClientList WHERE clientListId = V_ClientListId;

                 /*  
        IF (@ROWCOUNT = 0) THEN

                  LEAVE Loop_lable;
        END IF;
        */  
        IF (V_ThemeId != '' AND V_Logo != '' AND V_Logo != 'abc') THEN /* Theme and Logo */

            SET V_IsThemeLogoUploded = 1;
        END IF;

        IF ((SELECT COUNT(1)
             FROM appclient.tbl_ClientEventType CET INNER JOIN appmaster.tbl_Field MF ON CET.eventTypeId = MF.eventTypeId AND MF.isActive = 1
             WHERE CET.clientId = V_ClientId AND CET.isActive = 1)
          = (SELECT COUNT(1) FROM appclient.tbl_CustomParameter CP  
             INNER JOIN appclient.tbl_ClientEventType  CET ON CP.eventTypeId = CET.eventTypeId AND CP.clientId=CET.clientId AND CET.isActive=1
             WHERE CP.clientId = V_ClientId)) THEN /* Default Configuration */

            SET V_IsConfigurationDone = 1;
        END IF;

        IF (V_IsManDocsReq = 1) THEN /* Bidder Registration Docs Required */

            IF EXISTS (SELECT 1 FROM appclient.tbl_ClientRegDoc WHERE clientId = V_ClientId AND isActive = 1) THEN /* Mandatory Registration Docs Defined */

                SET V_IsRegDocsUploaded = 1;
            END IF;

        ELSE 

            SET V_IsRegDocsUploaded = 1;
        END IF;

        /* Client bid term required */
        IF ((SELECT COUNT(1) 
             FROM `appclient.tbl_ClientEventType` CET 
             LEFT OUTER JOIN `appclient.tbl_ClientBidTerm` CBT ON CET.clientId = CBT.clientId AND CET.eventTypeId = CBT.eventTypeId AND CBT.isActive = 1
             WHERE CET.clientId = V_ClientId AND CET.isActive = 1 AND CBT.clientBidTermId IS NULL) = 0) THEN

            SET V_IsClientBidTermGridLink = 1;
            END IF;

            IF ((SELECT COUNT(1)
                 FROM `appclient.tbl_ClientEventType` CET INNER JOIN appclient.tbl_ClientLanguage CL ON CET.clientId = CL.clientId AND CL.isActive = 1
                 WHERE CET.clientId = V_ClientId AND CET.isActive = 1)
              = (SELECT COUNT(1) FROM `appclient.tbl_ClientBidTerm` CBT WHERE CBT.clientId = V_ClientId AND CBT.isActive = 1)) THEN

                SET V_IsClientBidTermConfigured = 1;


        ELSE 

            SET V_IsClientBidTermCreateLink = 1;
        END IF;

        IF (V_IsThemeLogoUploded = 1 AND V_IsConfigurationDone = 1 AND V_IsRegDocsUploaded = 1 AND V_IsClientBidTermConfigured = 1) THEN 

            SET V_IsApproveLink = 1;
        END IF; 

        IF (V_IsActive = 1) THEN 

            SET V_IsApproveLink = 0;
            SET V_Status = 'Approved';

        ELSE

            SET V_Status = 'Pending';
        END IF;

        UPDATE `ttbl_ClientList` 
        SET isApproveLink = V_IsApproveLink, isClientBidTermCreateLink = V_IsClientBidTermCreateLink, 
            isClientBidTermGridLink = V_IsClientBidTermGridLink, isOnlinePayment = V_IsOnlinePayment, 
            cstatus = V_Status
        WHERE clientListId = V_ClientListId;

        SET V_ClientListId = V_ClientListId + 1;
    END WHILE;

    SELECT clientId AS FieldValue1, CONCAT( domainName ,' </A> <BR>', deptName) AS FieldValue2, 
           deptName AS FieldValue3, isManDocsReq AS FieldValue4,CASE WHEN isCPPPRequired = 0 THEN isApproveLink WHEN (isCPPPRequired = 1 AND cppCount = 1) THEN isApproveLink ELSE 0 END AS FieldValue5, cstatus  AS FieldValue6, 
           isClientBidTermCreateLink AS FieldValue7, isClientBidTermGridLink AS FieldValue8, isOnlinePayment AS FieldValue9,
       CASE WHEN (isCPPPRequired = 1) THEN 1 ELSE 0 END AS FieldValue11
    FROM `ttbl_ClientList`;

    SET V_TotalPages = CEILING( V_TotalRecords  / V_PagePerRecordN);
    SET V_TabCountDetails = '';
END$$

DELIMITER ;

答案 2 :(得分:0)

return args[0]+add.apply(this,args);更改为return arguments[0]+ add.apply(this,args)

在这个问题中,我首先拼错了args,然后引用了args [0]。